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 了解详情。
我四处搜索,但在这里找不到针对此特定问题的先例。引用,我看过以下问题。
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 了解详情。