首页 > 解决方案 > Java浮点格式问题

问题描述

我从 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.704737 07

如果我使用同样的问题:

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.704737 11到 1.704737 07)。

标签: javaformatting

解决方案


这是因为该值的精度实际上并不float意味着该值。1.70437111.7043711

考虑以下哪个过程1.70473711f既是 afloat又是 a 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

推荐阅读