java 浮点数转换为字符串给出不同的结果

java float conversion to string giving different result

为什么下面的 java 代码打印相同浮点变量的不同值(小数部分)?

public static void main(String[] args) {
    float f = 2001797.11f;
    System.out.println(String.format("%013.2f", f));
    System.out.println(Float.toString(f));
    System.out.println(String.format("%018.5f", f));
}

输出:

0002001797.13
2001797.1
000002001797.12500

String.format 使用显式格式规则 Float.toString(float n) 使用文档中描述的算法: http://docs.oracle.com/javase/7/docs/api/java/lang/Float.html#toString(float)

混乱源于行 float f = 2001797.11f;。最接近数学值"2001797.11"float实际上是2001797.125。您可以通过执行

来查看
System.out.println(new BigDecimal(2001797.11f));

因此,f 实际上是 2001797.125 并且 String.format 的 2 次使用已正确舍入。

那么为什么 Float.toString(f) 不产生 "2001797.125"?这是因为 Float.toString 只显示足够的小数位,以便将值与其他 float 区分开来。在这种情况下,只显示小数点后的 1 即可。

您必须考虑 floatdouble 类型处理 浮点数 数字:这意味着它们必须在整数和小数部分。

以此类推:整数部分中位数最多的位将专用于它们,小数部分的位数较少。因此,小数部分将 不太准确

您遇到的问题来自两个事实:

  • 整数部分的位数过多。
  • 使用浮动。

如果您需要更精确(根据您的程序必须处理的值的规模),您应该迁移到 double。如果你想要无限精度,BigDecimal.