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

Javascript: Is This Truly Signed Integer Division

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

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

并且假设运行时完全符合ecmascript 6规范,那么quotient的值是否总是ab作为整数的正确有符号整数除法?换言之,这是否是一种在JavaScript中实现与机器指令等效的真正有符号整数除法的适当方法?


我不是浮点数专家,但维基百科说双打有52位精度。从逻辑上讲,52位应该足以可靠地近似32位整数的整数除法。

将最小和最大32位有符号整数-2147483648 / 2147483647除,生成-1.0000000004656613,这仍然是一个合理数量的有效数字。它的反义词2147483647 / -2147483648也一样,产生-0.9999999995343387

一个例外是被零除,这是我在评论中提到的。正如链接的so-question所说,整数被零除通常会产生某种错误,而浮点强制则会导致(1 / 0) | 0 == 0

更新:根据另一个so答案,c中的整数除法被截断为零,这就是|0在javascript中所做的。另外,除法0是未定义的,所以在技术上,javascript返回零是不正确的。除非我漏掉了其他的东西,否则原始问题的答案应该是"是"。

更新2:ecmascript 6规范的相关章节:如何划分数字以及如何转换为32位有符号整数,这就是|0所做的。