有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java:使用printf时发生格式化错误

我到处找了找,找不到这个问题的先例。在这里,我看了以下问题

using printf for multiple formats

Formatting using printf and format

Formatting problems using printf in java

下面我将概述我遇到问题的代码片段。请记住,我正试图更好地理解效率输出,并探索为什么某些输入会导致指数、对数、线性增长等。无论如何

for (int i = 0; i < 5; i++) {
     time = System.nanoTime();
     tl.timeTrial(N);
     elapsedTime = (System.nanoTime() - time) / BILLION;
     System.out.print(N + "\t");
     System.out.printf("%4.3f\t", elapsedTime);
     if (i != 0) {
        r = elapsedTime / previousTime;
        System.out.printf("%3.2\t", r);
        k = Math.log(r);
        System.out.printf("%3.2\n", k);
     }
     else {
        System.out.print("\n");
     }  

     previousTime = elapsedTime;
     N *= 2;
  }

从这里我将指出一些事情

System.out.printf("%4.3\t", elapsedTime);

编译和运行完美。然而,当我进入带有r和k的if语句时,我得到了一个运行时错误,我一辈子都不明白为什么。错误如下:

Exception in thread "main" java.util.UnknownFormatConversionException: Conversion = '4'
at java.util.Formatter.checkText(Formatter.java:2579)
at java.util.Formatter.parse(Formatter.java:2565)
at java.util.Formatter.format(Formatter.java:2501)
at java.io.PrintStream.format(PrintStream.java:970)
at java.io.PrintStream.printf(PrintStream.java:871)
at TimingLabClient.main(TimingLabClient.java:61)

谢谢你的帮助。希望我不会因为问了一个我再也找不到答案的问题而被禁止

多谢各位。对于那些对我的\t和\n感到困惑的人,它有助于输出格式,而输出格式不一定是完美的

N   Time(sec)   R   K
8   0.723   
16  5.760   7.964   2.075
32  47.098  8.176   2.101

这个程序实际上要运行大约7个小时


共 (1) 个答案

  1. # 1 楼答案

    该代码中有很多问题:

    • 使用不带格式说明符的printf是主要问题。例如,System.out.printf("%3.2\t", r);毫无意义。当您不给Java一个字符来指示r应该是什么格式时,Java应该如何格式化r。在%和数字后面必须有一个合适的说明符,这里f可以工作,这意味着你有一个浮点数:"%4.3f"
    • \t和{}没有做你认为他们应该做的事情。
      • 如果可以使用printf,请避免使用制表符,而是使用格式宽度。制表符是不可靠的分隔符,因为它们不考虑其附近字符串的宽度,而格式宽度则考虑
      • 对printf中的新行使用%n

    最重要的是,阅读adecent formatting tutorial了解详细信息