双重比较。解释不同的结果

时间:2014-01-26 15:05:37

标签: java

我尝试训练scjp。

我有这段代码:

 System.out.println(0.8==0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1);//false
 System.out.println(0.8==((0.1+0.1)+(0.1+0.1))+((0.1+0.1)+(0.1+0.1))); // true

输出:

true
false

我知道正确的比较是这样的:

abs(a1-a2)<epsilon

但这个结果对我来说很奇怪。谁能为我解释一下?

scjp是否有类似的问题?

1 个答案:

答案 0 :(得分:1)

在Java中,double值是IEEE浮点数。除非它们是2的幂(或2的幂的总和,例如1/8 + 1/4 = 3/8),否则即使它们具有高精度,也不能精确地表示它们。某些浮点运算会使这些浮点数中出现的舍入误差复杂化。在您上面描述的情况中: 0.1 + 0.1 .... 8的总和结果为0.7999999999999999,而在第二个和的结果为0.8,结果为真。