Java中的浮点怪异现象

时间:2011-02-04 06:20:53

标签: java floating-accuracy

  

可能重复:
  Strange floating-point behaviour in a Java program

我在Java中遇到了这种奇怪的现象。在Java程序中尝试此语句:

System.out.print(4.0-3.1);

输出将为0.8999999

为什么会这样?它怎么能改变呢?

5 个答案:

答案 0 :(得分:4)

我建议阅读What Every Scientist Should Know About Floating-Point Arithmetic。这是浮点数学的标准行为。大多数系统(包括Java)使用IEEE 754作为浮点数的标准表示。精确的数值并不总是完全由此标准表示,因此您在打印时经常会看到轻微的数值不一致,如您在此处所见。

答案 1 :(得分:3)

这是一个典型的浮点结果。

FloatDouble会得到不同的结果:

System.out.println(4.0f-3.1f);
System.out.println(4.0d-3.1d);

输出:

0.9000001
0.8999999999999999

这是因为0.1无法在基数2中均匀表示,导致精度损失。例如:

System.out.println(2.0f-1.9f);
System.out.println(2.0d-1.9d);

两者都应该返回0.1但实际上会输出:

0.100000024
0.10000000000000009

答案 2 :(得分:2)

浮点数不能代表0.1或0.1的任意倍数。它是显示的数字系统的基数为2的基数为10.以基数2格式存储基数为10的数据时会丢失一些数据。

答案 3 :(得分:1)

您会找到答案behind this link

TL; DR摘要:您必须了解浮点在计算中的表现方式,以便了解这些事情发生的原因。这是一个浮点表示的工件,如果这种结果对你不可接受,你可以通过不使用float类型来改变它。

答案 4 :(得分:1)

您正在玩浮动类型。但是二进制。在十进制系统中有周期性数字。像1/3那样是1.33333等等。十进制系统中的某些数字不是周期性的,但在二进制系统中是周期性的。

因此,当有可能存在周期性数字时,计算总是不准确的。