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

t.n*_*ese 11 javascript

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

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

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

let a = 860.42065
a *= 1/860.42065
console.log(a);
Run Code Online (Sandbox Code Playgroud)

let a = 860.42065
a = a * 1/860.42065
console.log(a);
Run Code Online (Sandbox Code Playgroud)

所以人们可以期望那些应该有相同的结果,因为a *= b被视为a = a * b+= (plus equal) 是如何工作的?)的捷径。

但是这两个片段的结果可能不同。

sab*_*lam 7

这是因为*=有一个优先级低于* 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