是加法交换吗?

时间:2013-01-27 21:17:34

标签: javascript numbers

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

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

交换性怎么样?是否存在JavaScript编号ab

typeof a === 'number'
typeof b === 'number'
a + b !== b + a

所有评价为trueNaN除外)?

1 个答案:

答案 0 :(得分:2)

如果你仔细看一下,你会看到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节):

添加是一种可交换的操作,但并不总是关联的。