JavaScript整数数学结果不正确

Ste*_* Lu 3 javascript integer overflow

我只是想在JS中实现一个简单的RNG.

发生了什么事是JavaScript的评估119106029 * 1103515245131435318772912110不是131435318772912105.我们知道这是错误的,因为两个奇数相乘不会给出偶数.

谁知道怎么了?我只想要一个可靠的可重复RNG,并且由于这些不正确的值,我无法得到与我同样的C实现相匹配的结果.

Jas*_*rff 18

根据ECMAScript标准,JavaScript中的所有数字都是(64位IEEE 754)浮点数.

但是,所有32位整数都可以精确表示为浮点数.您可以使用适当的按位运算符将结果强制为32位,如下所示:

x = (a * b) >>> 0;  // force to unsigned int32
x = (a * b) | 0;    // force to signed int32
Run Code Online (Sandbox Code Playgroud)

很奇怪,但这是标准.

(顺便提一下,这种舍入行为是针对Firefox的JavaScript引擎最常报告的"错误"之一.看起来今年迄今已报道过3次......)

至于JavaScript中可重现的随机数,V8基准测试使用:

// To make the benchmark results predictable, we replace Math.random
// with a 100% deterministic alternative.
Math.random = (function() {
  var seed = 49734321;
  return function() {
    // Robert Jenkins' 32 bit integer hash function.
    seed = ((seed + 0x7ed55d16) + (seed << 12))  & 0xffffffff;
    seed = ((seed ^ 0xc761c23c) ^ (seed >>> 19)) & 0xffffffff;
    seed = ((seed + 0x165667b1) + (seed << 5))   & 0xffffffff;
    seed = ((seed + 0xd3a2646c) ^ (seed << 9))   & 0xffffffff;
    seed = ((seed + 0xfd7046c5) + (seed << 3))   & 0xffffffff;
    seed = ((seed ^ 0xb55a4f09) ^ (seed >>> 16)) & 0xffffffff;
    return (seed & 0xfffffff) / 0x10000000;
  };
})();
Run Code Online (Sandbox Code Playgroud)