JavaScript的数字很古怪。我意识到加法不是关联的:

(-9999999999999999 + 1) + 1 === -9999999999999999 + (1 + 1) // false!

可交换性如何?是否有JavaScript数字ab这样
typeof a === 'number'
typeof b === 'number'
a + b !== b + a

全部评估为true(NaN除外)?

最佳答案

如果仔细查看,您将看到1-9999999999999999返回-10000000000000000,这不是此操作的结果(应为-9999999999999998)
您正达到浮点精度的极限。
执行此操作时,您可以看到相同的效果:0.0000000000000001 + 1和0.0000000000000002 + 1

因此,ecmascript specification数字应遵循64位格式IEEE 754标准。这对应于16位精度。这正是您的数字大小。

编辑

关于您的可交换性问题,规格说明如下:

在其余情况下,既不涉及无穷大,也不涉及零,也不涉及NaN,并且操作数具有相同的符号或具有不同的大小,则使用IEEE 754四舍五入法计算和并将其四舍五入为最接近的可表示值。模式。如果幅度太大而无法表示,则操作会溢出,结果将是无穷大的适当符号。 ECMAScript语言需要支持IEEE 754所定义的渐进式下溢。

因此,它应该始终是可交换的,因为计算总和然后将其四舍五入。其他任何行为都可能是浏览器的错误。

编辑2

更明确的是,规范明确指出(第11.6.3节):

加法是可交换的运算,但并不总是关联的。

09-25 19:52