为什么0.1 + 0.2 + 0.3等于0.3 + 0.2 + 0.1?

时间:2018-05-31 10:05:23

标签: javascript floating-point floating-accuracy

注意:我不会问为什么0.1 + 0.2与0.3不同。

根据Is floating point math broken?,0.1 + 0.2不等于0.3,因为在比较之前0.1和0.2已经四舍五入到不同的数字,这与0.3的舍入数不同。

但我的问题是,为什么0.1 + 0.2 + 0.3!= 0.3 + 0.2 + 0.1?



console.log(0.1+0.2+0.3==0.3+0.2+0.1);




我的假设:在计算机内部,浮点数将四舍五入为一个值:

0.1是圆到A

0.2是圆到B

0.3是圆到C

因为舍入值是精确的(可以用二进制表示),所以我认为

A + B + C应该与C + B + A完全相等,就像1 + 2 + 3恰好等于3 + 2 + 1。但现在结果不同了。我的假设有什么问题?

2 个答案:

答案 0 :(得分:2)

因为浮点数学被打破了。

从左到右执行添加(请参阅#13: Addition)。

0.1 + 0.2 + 0.3等于(0.1 + 0.2) + 0.3结果:0.3000000000000001 + 0.3
0.3 + 0.2 + 0.1等于(0.3 + 0.2) + 0.1结果:0.5 + 0.1

所以,是的,这与0.1 + 0.2

不同0.3

console.log( 0.1 + 0.2  + 0.3);
console.log((0.1 + 0.2) + 0.3);
console.log( 0.3 + 0.2  + 0.1);
console.log((0.3 + 0.2) + 0.1);

答案 1 :(得分:0)

浮点加法不是关联的。 想象一个夸张的案例:

1.0 +(2.0 53 - 2.0 53 )= 1.0 + 0.0 = 1.0

(1.0 + 2.0 53 ) - 2.0 53 = 2.0 53 - 2.0 53 = 0.0

这是因为1.0 + 2.0 53 四舍五入为2.0 53 ,因为在64位双精度浮点数中只有53位的精度,并且你需要54位代表1.0 + 2.0 53