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

  • 本文关键字:quot 结果 浮点数 javascript
  • 更新时间 :
  • 英文 :


我从一个标记为重复的问题中借用了这段代码,然后删除了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_。

最新更新