我从一个标记为重复的问题中借用了这段代码,然后删除了1,但因为我找不到它的确切重复,我想为此创建一个新问题。
我知道浮点运算的问题(浮点运算坏了吗?(,但这个特例仍然很有趣。
以下两个片段看起来似乎相等:
let a = 860.42065
a *= 1/860.42065
console.log(a);
let a = 860.42065
a = a * 1/860.42065
console.log(a);
因此,人们可以预期这些结果应该是相同的,因为a *= b
被视为a = a * b
的快捷方式(+=(加上相等(如何工作?(。
但这两个片段的结果可能会有所不同。
这是因为根据MDN,*=
的优先级低于* or /
。
所以,当我们写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)
。这就是为什么首先评估CCD_ 14,然后乘以CCD_。