给出以下代码,其中a
和b
都是Number
s,表示有符号32位有符号整数范围内的值:
var quotient = ((a|0) / (b|0))|0;
并假设运行时完全符合ECMAScript 6规范,quotient
的值总是是a
和{{}的正确有符号整数除法1}}作为整数?换句话说,这是一种在JavaScript中实现真正有符号整数除法的正确方法,它等同于机器指令吗?
答案 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 integer,what |0
does。