我在Java中遇到了这种奇怪的现象。在Java程序中尝试此语句:
System.out.print(4.0-3.1);
输出将为0.8999999
为什么会这样?它怎么能改变呢?
答案 0 :(得分:4)
我建议阅读What Every Scientist Should Know About Floating-Point Arithmetic。这是浮点数学的标准行为。大多数系统(包括Java)使用IEEE 754作为浮点数的标准表示。精确的数值并不总是完全由此标准表示,因此您在打印时经常会看到轻微的数值不一致,如您在此处所见。
答案 1 :(得分:3)
这是一个典型的浮点结果。
Float
和Double
会得到不同的结果:
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等等。十进制系统中的某些数字不是周期性的,但在二进制系统中是周期性的。
因此,当有可能存在周期性数字时,计算总是不准确的。