JavaScript中的最大整数值

时间:2014-01-25 11:52:52

标签: javascript

我正在阅读second chapter of the book Eloquent JavaScript。作者说:

  

Any whole number less than 2^52 (which is more than 10^15) will safely fit in a JavaScript number.

我从wikipedia抓取了2 ^ 52的值。

  

4,503,599,627,370,496

该值必须小于2 ^ 52,所以我从初始值减去1;

var max = 4503599627370495;

定义max变量后,我正在检查值是什么(我正在使用Chrome 32.0.1700.77)。

console.log(max); // 4503599627370495

我想看看当我超过这个限制时会发生什么,所以我要添加一次。

出乎意料:

max += 1;
console.log(max); // 4503599627370496
max += 1;
console.log(max); // 4503599627370497
max += 1;
console.log(max); // 4503599627370498

我超越了限制,计算仍然很精确。

我尝试了下一个2的功率,2 ^ 53,这次我没有减去1:

  

9,007,199,254,740,992

var max = 9007199254740992;

这个似乎是一个更大的限制,似乎我可以非常安全地添加和减去数字:

max += 1;
console.log(max); // 9007199254740992
max += 1;
console.log(max); // 9007199254740992
max -= 1;
console.log(max); // 9007199254740991
max += 1;
console.log(max); // 9007199254740992
max -= 900;
console.log(max); // 9007199254740092
max += 900;
console.log(max); // 9007199254740992

我可以为最大值分配更大的值,但是它会失去精度,我无法再安全地添加或减去数字。

能否请您准确解释引擎盖下的机制?高于2 ^ 52之后比特会发生什么事情的一个例子真的很有帮助。

3 个答案:

答案 0 :(得分:10)

这不是强类型编程语言。 JS有一个对象Number。你甚至可以得到一个无限的数字:document.write(Math.exp(1000));

document.write(Number.MIN_VALUE + "<br>");
document.write(Number.MAX_VALUE + "<br>");

document.write(Number.POSITIVE_INFINITY + "<br>");
document.write(Number.NEGATIVE_INFINITY + "<br>");

    alert([
         Number.MAX_VALUE/(1e293),
         Number.MAX_VALUE/(1e292),
         Number.MAX_VALUE/(1e291),
         Number.MAX_VALUE/(1e290),
    ].join('\n'))

希望这是一个有用的答案。谢谢!

<强>更新 max int是 - +/- 9007199254740992

答案 1 :(得分:6)

您可以在此处找到有关JavaScript编号类型的一些信息:ECMA-262 5th Edition: The Number Type

正如它所提到的,数字表示为64位浮点数,53位尾数(有效数字)和11位指数(IEEE 754)。然后用以下结果获得结果:尾数* 2 ^指数。

这意味着在尾数中可以表示最多2 ^ 53个值(少数数字具有特殊含义,其他数字为正整数和负整数)。

数字2 ^ 53(9007199254740992)无法在尾数中表示,您必须使用指数。例如,您可以将2 ^ 53表示为(9007199254740992 / 2) * 2^1,即。 mantissa = 9007199254740992 / 2 = 4503599627370496exponent = 1

让我们看看2 ^ 53 + 1(9007199254740993)会发生什么。在这里,我们必须这样做,mantissa = 9007199254740993 / 2 = 4503599627370496。哎呀,这不是我们2 ^ 53的尾数吗?看起来有一些舍入错误! :)

(注意:以上示例实际上并不是它的实际工作原理:尾数总是被解释为在第一个数字后面有一个点,这意味着例如,数字3实际上存储为1.5*2。我在上面的解释中省略了这一点,以便更容易理解。)

您可以在此处找到有关浮点数(一般)的更多信息:What Every Computer Scientist Should Know About Floating-Point Arithmetic

答案 2 :(得分:2)

您可以在JS中考虑52位整数,但请记住,按位逻辑运算符& | >>等只会处理32个不太重要的位,而丢弃其余位。< / p>