Javascript:这是真正签名的整数部门

时间:2015-07-11 04:45:27

标签: javascript integer ecmascript-6 integer-division

给出以下代码,其中ab都是Number s,表示有符号32位有符号整数范围内的值:

var quotient = ((a|0) / (b|0))|0;

并假设运行时完全符合ECMAScript 6规范,quotient 的值总是是a和{{}的正确有符号整数除法1}}作为整数?换句话说,这是一种在JavaScript中实现真正有符号整数除法的正确方法,它等同于机器指令吗?

1 个答案:

答案 0 :(得分:5)

我不是浮点数的专家,但是Wikipedia说双精度具有52位精度。从逻辑上讲,似乎52位应足以可靠地逼近32位整数的整数除法。

除以最小和最大32位有符号整数-2147483648 / 2147483647,会产生-1.0000000004656613,这仍然是一个合理的有效位数。其反向2147483647 / -2147483648也是如此,它产生-0.9999999995343387

例外是division by zero,我在评论中提到过。正如链接的SO问题所述,整数除零通常会引发某种错误,而浮点强制会产生(1 / 0) | 0 == 0

更新:根据another SO answer,C中的整数除法截断为零,这是|0在JavaScript中的作用。除此之外,除以0是未定义的,因此JavaScript在返回零时在技术上并不正确。除非我错过任何其他内容,否则原始问题的答案应该是肯定的。

更新2: ECMAScript 6规范的相关部分:如何divide numbers以及如何convert to a 32-bit signed integerwhat |0 does