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


当前回答

253 == 9 007 199 254 740 992。这是因为数字存储为52位尾数中的浮点数。

最小值为-253。

这使得一些有趣的事情发生了

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

其他回答

要用于位操作的任何值必须在0x80000000(-2147483648或-2^31)和0x7fffffff(2147483647或2^31 - 1)之间。

控制台会告诉您0x80000000等于+2147483648,但是0x80000000 & 0x80000000等于-2147483648。

Node.js和谷歌Chrome似乎都使用1024位浮点值,因此:

Number.MAX_VALUE = 1.7976931348623157e+308

JavaScript在ECMAScript 2020中收到了一个新的数据类型:BigInt。它引入了带有“n”后缀的数值字面量,并允许任意精度:

var a = 123456789012345678901012345678901n;

当然,当这样大的整数(可能是无意的)被强制转换为数字数据类型时,精度仍然会丢失。

而且,很明显,由于有限的内存,总是会有精度限制,为了分配必要的内存和对如此大的数字执行算术,在时间方面会有成本。

例如,生成一个具有10万个十进制数字的数字,在完成之前会有明显的延迟:

console.log(BigInt("1".padEnd(100000,"0")) + 1n)

...但它确实有效。

简短的回答是“视情况而定。”

如果你在任何地方使用位操作符(或者如果你引用数组的长度),范围是:

无符号:0…(1 > > > 0)

签名:(-(1 > > > 1)1)……(1 > > > 1)

(恰巧按位操作符和数组的最大长度被限制为32位整数。)

如果你不使用位操作符或使用数组长度:

签名:(-Math pow (2.53)) ... + Math . pow (2.53))

这些限制是由“Number”类型的内部表示施加的,通常对应于IEEE 754双精度浮点表示。(请注意,与典型的有符号整数不同,由于内部表示的特征,负极限的大小与正极限的大小相同,它实际上包括一个负0!)

为了安全

var MAX_INT = 4294967295;

推理

我认为我应该聪明一点,用更实用的方法找到x + 1 === x的值。

我的机器每秒只能计算1000万次左右……所以我会在28.56年后给出确切的答案。

如果你等不了那么久,我敢打赌

大多数循环都不会持续28.56年 9007199254740992 ===数学。Pow(2,53) + 1是足够的证明 您应该坚持使用4294967295,即Math.pow(2,32) - 1,以避免预期的位移位问题

求x + 1 === x:

(function () {
  "use strict";

  var x = 0
    , start = new Date().valueOf()
    ;

  while (x + 1 != x) {
    if (!(x % 10000000)) {
      console.log(x);
    }

    x += 1
  }

  console.log(x, new Date().valueOf() - start);
}());