javascript中一个数字在不损失精度的情况下可以达到的最大整数值是多少?

inn6fuwd  于 2021-09-13  发布在  Java
关注(0)|答案(20)|浏览(462)

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

k5hmc34c

k5hmc34c16#

为了安全

var MAX_INT = 4294967295;

推理

我想我会很聪明,找到它的价值所在 x + 1 === x 以更务实的方式。
我的机器每秒只能数1000万左右。。。因此,我将在28.56年后发布最终答案。
如果你不能等那么久,我敢打赌
你的大部分循环都不会运行28.56年 9007199254740992 === Math.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);
}());
3xiyfsfu

3xiyfsfu17#

jimmy的答案正确地表示连续javascript整数范围为-9007199254740992到9007199254740992(抱歉9007199254740993,您可能认为您是9007199254740993,但您错了!下面的演示或在jsfiddle中的演示)。

console.log(9007199254740993);

然而,没有一个答案能在程序上找到/证明这一点(除了coolaj86在其答案中提到的将在28.56年内完成的答案;),因此,这里有一种更有效的方法(准确地说,它的效率提高了28.559999968312年:),还有一把测试小提琴:

/**
 * Checks if adding/subtracting one to/from a number yields the correct result.
 *
 * @param number The number to test
 * @return true if you can add/subtract 1, false otherwise.
 */
var canAddSubtractOneFromNumber = function(number) {
    var numMinusOne = number - 1;
    var numPlusOne = number + 1;

    return ((number - numMinusOne) === 1) && ((number - numPlusOne) === -1);
}

//Find the highest number
var highestNumber = 3; //Start with an integer 1 or higher

//Get a number higher than the valid integer range
while (canAddSubtractOneFromNumber(highestNumber)) {
    highestNumber *= 2;
}

//Find the lowest number you can't add/subtract 1 from
var numToSubtract = highestNumber / 4;
while (numToSubtract >= 1) {
    while (!canAddSubtractOneFromNumber(highestNumber - numToSubtract)) {
        highestNumber = highestNumber - numToSubtract;
    }

    numToSubtract /= 2;
}        

//And there was much rejoicing.  Yay.    
console.log('HighestNumber = ' + highestNumber);
643ylb08

643ylb0818#

在javascript中,有一个数字叫做 Infinity .
示例:

(Infinity>100)
=> true

// Also worth noting
Infinity - 1 == Infinity
=> true

Math.pow(2,1024) === Infinity
=> true

这可能足以回答有关此主题的一些问题。

55ooxyrt

55ooxyrt19#

它是253==9 007 199 254 740 992。这是因为 Number s以浮点形式存储在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

nbewdwxp

nbewdwxp20#

=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

相关问题