这是由语言定义的吗?有定义的最大值吗?在不同的浏览器中是不同的吗?
一个数字在不损失精度的情况下可以达到的 JavaScript 的最高整数值是多少?
JavaScript 有两种数字类型:Number
和BigInt
。
最常用的数字类型Number
是 64 位浮点IEEE 754数字。
这种类型的最大精确整数值为Number.MAX_SAFE_INTEGER
,即:
- 2 53 -1,或
- +/- 9,007,199,254,740,991,或
- 九亿七万亿一千九百九十二亿五千四百万七十万九千九十一
从这个角度来看:一千万亿字节是 PB(或一千 TB)。
在此上下文中,“安全”是指准确表示整数并正确比较它们的能力。
请注意,所有大小不大于 2 53的正整数和负整数都可以在
Number
类型中表示(实际上,整数 0 有两种表示形式,+0 和 -0)。
要安全地使用大于此值的整数,您需要使用BigInt
,它没有上限。
请注意,按位运算符和移位运算符对 32 位整数进行运算,因此在这种情况下,最大安全整数为 2 31 -1 或 2,147,483,647。
const log = console.log
var x = 9007199254740992
var y = -x
log(x == x + 1) // true !
log(y == y - 1) // also true !
// Arithmetic operators work, but bitwise/shifts only operate on int32:
log(x / 2) // 4503599627370496
log(x >> 1) // 0
log(x | 1) // 1
关于数字 9,007,199,254,740,992 的技术说明:这个值有一个精确的 IEEE-754 表示,你可以从一个变量中分配和读取这个值,所以对于小于或等于整数域中非常仔细选择的应用程序此值,您可以将其视为最大值。
在一般情况下,您必须将此 IEEE-754 值视为不准确,因为它是对逻辑值 9,007,199,254,740,992 还是 9,007,199,254,740,993 进行编码是不明确的。
>= ES6:
Number.MIN_SAFE_INTEGER;
Number.MAX_SAFE_INTEGER;
<= ES5
从参考:
Number.MAX_VALUE;
Number.MIN_VALUE;
它是 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
在 JavaScript 中,有一个数字叫做Infinity
。
例子:
(Infinity>100)
=> true
// Also worth noting
Infinity - 1 == Infinity
=> true
Math.pow(2,1024) === Infinity
=> true
对于有关此主题的某些问题,这可能就足够了。
吉米的回答正确代表连续的JavaScript整数频谱-9007199254740992到9007199254740992包容性(对不起9007199254740993,你可能会认为你是9007199254740993,但你错了! 下面或示范的jsfiddle)。
console.log(9007199254740993);
但是,没有以编程方式找到/证明这一点的答案(除了 CoolAJ86 在他的答案中提到的将在 28.56 年内完成的答案;),所以这里有一种稍微更有效的方法来做到这一点(准确地说,它更有效)大约 28.55999999968312 年 :),以及测试小提琴:
/**
* 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);