为什么浮点数的`a*b`和`a*=b`的结果不同

我从一个标记为重复的问题中借用了此代码,然后删除了1,但是因为我无法找到与它完全相同的重复项,所以我想为此创建一个新问题。

我知道浮点运算的问题(浮点运算是否被破坏?),但这种特殊情况仍然很有趣。

以下两个片段看起来似乎相同:

let a = 860.42065
a *= 1/860.42065
console.log(a);

回答

这是因为*=有一个优先级低于* or /按MDN。

所以,当我们写的时候a *= 1 / b它不等于a = a * 1 / b;

a *= 1/b它的情况下,它会先计算 1/b,然后将 a 与结果相乘。另一方面,

因为a = a * 1 / b,因为*/具有相同的优先级并且它们从左到右评估,a * 1将首先评估,然后结果将被除以b

更新(感谢@Felix Kling)这是准确的工作方式,

a *= 1/b 实际上隐式地将右手边分组,因此,它变成,a = a * (1/b)。这就是为什么1/b先求值然后乘以a


以上是为什么浮点数的`a*b`和`a*=b`的结果不同的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>