java float转换为字符串给出不同的结果

时间:2015-08-04 12:09:25

标签: java floating-point floating-point-conversion

为什么下面的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

3 个答案:

答案 0 :(得分:2)

混淆源于float f = 2001797.11f;行。与数学值float最接近的"2001797.11"实际上是2001797.125。你可以通过

来看到这一点
System.out.println(new BigDecimal(2001797.11f));

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

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

答案 1 :(得分:2)

您必须考虑floatdouble类型处理浮点数字:这意味着它们必须在整数和小数部分之间分配32位或64位

所以:整数部分中的大多数位,大多数位将专用于它们,小数部分的位数越少。因此,小数部分将不太准确

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

  • 整数部分中的位数过多。
  • 使用float。

如果您需要更多精确度(根据您的程序必须处理的值的比例),您应该迁移到double。如果你想要无限期,那就BigDecimal

答案 2 :(得分:0)

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