我尝试训练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是否有类似的问题?
答案 0 :(得分:1)
在Java中,double值是IEEE浮点数。除非它们是2的幂(或2的幂的总和,例如1/8 + 1/4 = 3/8),否则即使它们具有高精度,也不能精确地表示它们。某些浮点运算会使这些浮点数中出现的舍入误差复杂化。在您上面描述的情况中: 0.1 + 0.1 .... 8的总和结果为0.7999999999999999,而在第二个和的结果为0.8,结果为真。