JavaScript的数字很古怪。我意识到添加不是关联的:
(-9999999999999999 + 1) + 1 === -9999999999999999 + (1 + 1) // false!
交换性怎么样?是否存在JavaScript编号a
,b
typeof a === 'number'
typeof b === 'number'
a + b !== b + a
所有评价为true
(NaN
除外)?
答案 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节):
添加是一种可交换的操作,但并不总是关联的。