val*_*man 18
精简版
Math.imul(a,b)将a和b相乘,就好像它们是32位有符号整数一样.(a*b)|0做同样的事情,但可能会给大数字提供不正确的结果.
长版
您可以Math.imul在需要乘以两个数字时使用,并且希望乘法操作就像两个数字是32位有符号整数一样.也就是说,你想要整数乘法模2 ^ 32.
通常,您可以通过对结果使用按位运算符来获得此效果.例如,(0xffffffff + 1)|0非常正确地给你0.但是,这不适用于乘法.(0x7fffffff * 0x7fffffff)|0给我们0,当两个数字的32位乘法给我们1.这种失败的原因是精确性.该Number类型是IEEE754双精度浮点数,具有53位尾数.当您尝试使用大于2 ^ 53的数字时,您开始失去精度.您可以Math.pow(2,53) == Math.pow(2,53)+1在浏览器中运行来测试它.
当您在Javascript中将两个32位数相乘并使用按位运算符截断结果时,中间结果可能大于2 ^ 53,因此可能不正确,这意味着最终结果当然也将是不正确的.