协慌网

登录 贡献 社区

什么是 JavaScript 的最高整数值,数字可以达到而不会丢失精度?

这是由语言定义的吗?是否有定义的最大值?在不同的浏览器中是不同的?

答案

+/- 9007199254740991

ECMA 第 8.5 节 - 数字

注意,幅度不大于 2 53 的所有正整数和负整数都可以在 Number 类型中表示(实际上,整数 0 有两个表示,+ 0 和 - 0)。

它们是 64 位浮点值,最大精确积分值是 2 53 -1 或9007199254740991 。在 ES6 中,这被定义为Number.MAX_SAFE_INTEGER

请注意,按位运算符和移位运算符以 32 位整数运算,因此在这种情况下,最大安全整数为 2 31 -1 或 2147483647。


测试出来!

var x = 9007199254740992;
var y = -x;
x == x + 1; // true !
y == y - 1; // also true !
// Arithmetic operators work, but bitwise/shifts only operate on int32:
x / 2;      // 4503599627370496
x >> 1;     // 0
x | 1;      // 1

有关数字 9007199254740992 的主题的技术说明:该值有一个精确的 IEEE-754 表示,您可以从变量中分配和读取该值,因此对于小于或等于整数域的非常仔细选择的应用程序此值,您可以将其视为最大值。

在一般情况下,您必须将此 IEEE-754 值视为不精确,因为它是否编码逻辑值 9007199254740992 或 9007199254740993 是不明确的。

> = ES6: Number.MIN_SAFE_INTEGER; Number.MAX_SAFE_INTEGER;

<= ES5

来自参考Number.MAX_VALUE; Number.MIN_VALUE;

console.log('MIN_VALUE', Number.MIN_VALUE);
console.log('MAX_VALUE', Number.MAX_VALUE);

console.log('MIN_SAFE_INTEGER', Number.MIN_SAFE_INTEGER); //ES6
console.log('MAX_SAFE_INTEGER', Number.MAX_SAFE_INTEGER); //ES6

它是 2 53 == 9 007 199 254 740 992. 这是因为Number s 在 52 位尾数中存储为浮点数。

最小值为 - 2 53

这会让一些有趣的事情发生

Math.pow(2, 53) == Math.pow(2, 53) + 1
>> true

而且也可能很危险:)

var MAX_INT = Math.pow(2, 53); // 9 007 199 254 740 992
for (var i = MAX_INT; i < MAX_INT + 2; ++i) {
    // infinite loop
}

进一步阅读: http//blog.vjeux.com/2010/javascript/javascript-max_int-number-limits.html