给定以下代码,其中a和b都是表示带符号32位有符号整数范围内的值的数字:
var quotient = ((a|0) / (b|0))|0;
并且假设运行时完全符合ECMAScript 6规范,商的值始终是a和b的正确有符号整数除以整数?换句话说,这是在JavaScript中实现相当于机器指令的真正有符号整数除法的正确方法吗?
解决方法
我不是浮点数的专家,但是
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中的整数除法截断为零,这是JavaScript中的| 0.另外,除以0是未定义的,所以JavaScript在返回零时在技术上不是不正确的.除非我错过任何其他事情,原来的问题的答案应该是肯定的.
更新2:ECMAScript 6规范的相关章节:如何divide numbers和convert to a 32-bit signed integer,这是what |0
does.