Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么';t0.1+;0.2+;0.3等于0.3+;0.2+;0.1?_Javascript_Floating Point_Floating Accuracy - Fatal编程技术网

Javascript 为什么';t0.1+;0.2+;0.3等于0.3+;0.2+;0.1?

Javascript 为什么';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)

注意:我不是问为什么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)+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