java浮点转换为字符串,得到不同的结果

java浮点转换为字符串,得到不同的结果,java,floating-point,floating-point-conversion,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)); }

为什么下面的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)
使用文档中描述的算法:
混淆源于行
float f=2001797.11f。与数学值最接近的
浮点值
“2001797.11”
实际上是
2001797.125
。你可以通过这样做看到这一点

System.out.println(new BigDecimal(2001797.11f));
因此,
f
实际上是
2001797.125
,并且
String.format
的两种用法已正确舍入


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

您必须考虑<代码>浮点< /代码>和<代码>双< /代码>类型处理浮点数:这意味着它们必须在整数和小数部分之间分配其32位或64位。< /P> 因此:整数部分的位数越多,专用于整数部分的位数就越多,小数部分的位数就越少。因此,小数部分的精确度较低

您面临的问题来自两个事实:

  • 整数部分的位数太多
  • 使用float

如果需要更高的精度(根据程序必须处理的值的比例),则应迁移到
double
。如果你想要无限精度,我想这可能是屏幕后面的舍入,但我想知道为什么我只是想打印相同的变量。它们中没有一个给出实际值
2001797.11
太大,无法精确表示浮动精度,因此我们是否应该根据设计将其称为缺陷或特性?