Java中的浮点怪异现象

Floating point Weird Phenomenon in Java

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Strange floating-point behaviour in a Java program

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

1
System.out.print(4.0-3.1);

输出为0.8999999

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


我建议每个科学家阅读关于浮点运算的知识。这是浮点数学的标准行为。大多数系统(包括Java)使用IEEE 754作为浮点数字的标准表示。确切地说,本标准并不总是完美地表示数值,因此您在打印时经常会看到轻微的数值不一致,如您在此处发现的。


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

FloatDouble得到的结果不同:

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

输出:

1
2
0.9000001
0.8999999999999999

这是因为0.1不能在基2中均匀表示,从而导致精度损失。例如:

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

如果两者都返回0.1,但实际上将输出:

1
2
0.100000024
0.10000000000000009


浮点不能精确表示0.1或0.1的任何倍数。它以2为基数,其中显示的数字系统以10为基数。以Base 2格式存储Base 10数据时,会丢失一些数据。


你在玩浮球。但是是二进制的。在十进制中有周期数。如1/3,即1.33333等。十进制系统中的一些数字不是周期性的,但在二进制系统中是周期性的。

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


你可以在这个链接后面找到你的答案。

TL;Dr Summary:您必须了解浮点在计算中是如何表示的,这样您就知道为什么会发生这些事情。这是一个浮点表示的工件,如果您不能接受这种结果,那么您可以通过不使用浮点类型来更改它。