JavaScript中的最大整数值

Emi*_* A. 15 javascript

我正在阅读Eloquent JavaScript一书第二章.作者指出:

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

我从维基百科中获取了2 ^ 52的值.

4,503,599,627,370,496

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

var max = 4503599627370495;
Run Code Online (Sandbox Code Playgroud)

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

console.log(max); // 4503599627370495
Run Code Online (Sandbox Code Playgroud)

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

不料:

max += 1;
console.log(max); // 4503599627370496
max += 1;
console.log(max); // 4503599627370497
max += 1;
console.log(max); // 4503599627370498
Run Code Online (Sandbox Code Playgroud)

我超过了限制,计算仍然是精确的.

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

9,007,199,254,740,992

var max = 9007199254740992;
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

能否请您准确解释引擎盖下的机制?在超过2 ^ 52之后,比特发生的事情的一个例子将是非常有帮助的.

Art*_*lev 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'))
Run Code Online (Sandbox Code Playgroud)

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

更新: max int是 - +/- 9007199254740992


Sie*_*ter 6

您可以在此处找到有关JavaScript编号类型的一些信息:ECMA-262第5版:数字类型.

正如它所提到的,数字表示为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.我在上面的解释中省略了这一点它更容易遵循.)

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