<分区>
以下表达式返回 false(例如在 Java 和 C# 中)
0.1 + 0.1 + 0.1 == 0.3
所以我们了解到我们总是像这样比较 double 和 float
Math.abs(double1 - double2) < epsilon
但是为什么
0.1 + 0.1 == 0.2 returns true and
0.1 + 0.1 + 0.1 == 0.3 returns false?
我知道跟尾数有关系,但是我不知道 准确理解。
<分区>
以下表达式返回 false(例如在 Java 和 C# 中)
0.1 + 0.1 + 0.1 == 0.3
所以我们了解到我们总是像这样比较 double 和 float
Math.abs(double1 - double2) < epsilon
但是为什么
0.1 + 0.1 == 0.2 returns true and
0.1 + 0.1 + 0.1 == 0.3 returns false?
我知道跟尾数有关系,但是我不知道 准确理解。
最佳答案
float / double 存储为二进制小数,而不是小数。
有些数字无法用我们的十进制表示法完全表示。比如1/3用十进制表示就是0.3333333……用二进制表示也是一样的,只是不能精确表示的数不一样。其中有数字1/10。在二进制表示法中是 0.000110011001100...
由于二进制表示法不能精确存储,所以采用四舍五入的方式存储。因此你的问题。
你不应该像这样比较 double 值:0.1 + 0.1 + 0.1 == 0.3,因为你永远不知道它们在内存中的存储方式,你永远不知道这种比较的结果是什么。
关于java - double 理论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27687385/