Javascript 为什么';t0.1+;0.2+;0.3等于0.3+;0.2+;0.1?
注意:我不是问为什么0.1+0.2与0.3不同 根据,0.1+0.2不等于0.3,因为在比较之前,0.1和0.2已经四舍五入到不同的数字,这与从0.3取整的数字不同 但我的问题是,为什么是0.1+0.2+0.3=0.3+0.2+0.1Javascript 为什么';t0.1+;0.2+;0.3等于0.3+;0.2+;0.1?,javascript,floating-point,floating-accuracy,Javascript,Floating Point,Floating Accuracy,注意:我不是问为什么0.1+0.2与0.3不同 根据,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+0.2+0.3等于(0.1+0.2)+0.3结果:0.30000000001+0.3 0.3+0.2+0.1等于(0.3+0.2)
console.log(0.1+0.2+0.3==0.3+0.2+0.1)代码>,因为浮点运算已中断
从左到右执行添加(请参阅)
0.1+0.2+0.3
等于(0.1+0.2)+0.3
结果:0.30000000001+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);
控制台日志((0.3+0.2)+0.1)代码>浮点加法不关联。
想象一个夸张的例子:
1.0+(2.053− 2.053)=1.0+0.0=1.0
(1.0+2.053)− 2.053 = 2.053 − 2.053=0.0
这是因为1.0+2.053四舍五入为2.053,因为64位双精度浮点数中只有53位精度,而您需要54位来表示1.0+2.053。因为浮点数学被破坏。加法从左到右执行0.1+0.2+0.3
等于(0.1+0.2)+0.3
和0.3+0.2+0.1
等于(0.3+0.2)+0.1
。因此,是的,这是关于“0.1+0.2
不同于0.3
”浮点运算中的累积舍入误差确实取决于运算顺序…@MihaiAlexandru Ionut:为什么这不是重复的?从本质上讲,这仍然是关于浮点数学被破坏的,它仍然是关于0.1+0.2
。它只是隐藏在一层“操作顺序”中。@Cerburs,对不起,是的,你说得对。@MihaiAlexandru Ionut:那么我可以建议重新结束这个问题吗?(1+2^54)-2^54
为我返回5
。或者你的意思是Math.pow(2,54)
?@Cerbrus:当然,我发布的表达式不是JavaScript。那么,@Cerbrus:你现在高兴吗?是的,那好多了:D