提问者:小点点

JavaScript中的最大整数值


我正在阅读《雄辩的JavaScript》一书的第二章。提交人指出:

任何小于 2^52(大于 10^15)的整数都可以安全地放入 JavaScript 数字。

我从维基百科上获取了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:

< code > 9007199254740992

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个答案

匿名用户

这不是一种强类型编程语言。JS有一个对象< code >编号。甚至可以得到一个无穷大的数:< code > 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'))

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

更新:最大int为-/-9007199254740992

匿名用户

你可以在这里找到一些关于JavaScript的数字类型的信息:ECMA-262第5版:数字类型。

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

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

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

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

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

你可以在这里找到更多关于浮点数的信息(一般来说):每个计算机科学家都应该知道的关于浮点运算。

匿名用户

您可以在JS中想到52位整数,但请记住,按位逻辑运算符<code>