Java 浮动格式问题

Java float formatting issue

我从 XML 文件中检索了一个浮点数,我想将其格式化并插入到文本文件中,格式为逗号后 8 位,逗号前 2 位。

这是我的代码:

String patternNNDotNNNNNNNN = "%11.8f";
float value = 1.70473711f;
String result = String.format(java.util.Locale.US, patternNNDotNNNNNNNN, value);
System.out.println(result);

结果我得到:1.70473707

如果我使用同样的问题:

java.text.DecimalFormatSymbols symbols = new java.text.DecimalFormatSymbols(java.util.Locale.US);
java.text.DecimalFormat df = new java.text.DecimalFormat("##.########", symbols);
System.out.println(df.format(value));

我不明白为什么我有一个四舍五入的值(1.70473711变成1.70473707)。

这是因为float精度意味着值1.7043711实际上不是1.7043711

考虑以下哪个进程 1.70473711f 既是 float 又是 double:

String patternNNDotNNNNNNNN = "%11.8f";

float valueF = 1.70473711f;
String result = String.format(java.util.Locale.US, patternNNDotNNNNNNNN, valueF);
System.out.println(valueF);
System.out.println(result);

double valueD = 1.70473711f;
result = String.format(java.util.Locale.US, patternNNDotNNNNNNNN, valueD);
System.out.println(valueD);
System.out.println(result);

输出:

1.7047371
 1.70473707
1.7047370672225952
 1.70473707

将值视为双精度值时,您可以看到 1.7043711f 实际上是 1.7047370672225952。将其四舍五入到 8 位会得到 1.70473707 而不是 1.70473711

相反,将数字视为双精度数(即删除 f),提高精度将产生预期的输出:

double valueD = 1.70473711;
String result = String.format(java.util.Locale.US, patternNNDotNNNNNNNN, valueD);
System.out.println(valueD);
System.out.println(result);

输出:

1.70473711
 1.70473711

String.format 对浮点值 舍入。如果您不想那样,请使用 BigDecimal。参见

double d = 0.125;
System.out.printf("%.2f%n", d);