Java: 使用 printf 时出现格式化错误

Java: Formatting error using 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 和 \ns 感到困惑的人,它有助于输出格式,这不一定是完美的。

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

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

你的代码有很多问题:

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

最重要的是,阅读 decent formatting tutorial 了解详情。