我正在阅读《雄辩的JavaScript》一书的第二章。提交人指出:
任何小于 2^52(大于 10^15)的整数都可以安全地放入 JavaScript 数字。
我从维基百科上获取了2^52的值。
4,503,599,627,370,496
这个值必须小于2^52,所以我从初始值中减去了1;
var max = 4503599627370495;
定义 max 变量后,我正在检查值是多少(我使用的是 Chrome 32.0.1700.77
)。
console.log(max); // 4503599627370495
我想看看当我超过这个极限时会发生什么,所以我会多次添加一个。
意外地:
max += 1;
console.log(max); // 4503599627370496
max += 1;
console.log(max); // 4503599627370497
max += 1;
console.log(max); // 4503599627370498
我超过了极限,计算仍然准确。
我尝试了 2 的下一个幂,2^53,这次我没有减去 1:
< code > 9007199254740992
var max = 9007199254740992;
这似乎是一个更大的限制,似乎我可以很安全地加减数字:
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
我可以给最大值分配一个更大的值,但是它失去了精度,我不能再安全地加减数字了。
你能准确解释一下引擎盖下面的机制吗?在超过2^52后,位发生了什么情况的示例将非常有用。
这不是一种强类型编程语言。JS有一个对象< code >编号。甚至可以得到一个无穷大的数:< code > 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'))
希望这是一个有用的答案。谢谢
更新:最大int为-/-9007199254740992
你可以在这里找到一些关于JavaScript的数字类型的信息:ECMA-262第5版:数字类型。
正如它提到的,数字表示为64位浮点数,53位尾数(有效数字)和11位指数(IEEE 754)。然后用以下公式得到结果:尾数* 2^exponent.
这意味着尾数中最多可以表示2^53个值(其中一些数字具有特殊含义,其他数字是正整数和负整数)。
数字2^53(9007199254740992)不能在尾数中表示,必须使用指数。例如,您可以将2^53表示为(9007199254740992/2)*2^1
,即尾数=9007199254740992/2=4503599627370496
和指数=1
。
让我们看看2^53 1(9007199254740993)发生了什么。这里我们也必须这样做,尾数=9007199254740993/2=4503599627370496
。哎呀,这不是我们在2^53时得到的尾数吗?看起来有一些舍入错误!:)
(注意:上面的例子实际上并不是它的实际工作原理:尾数总是被解释为在第一个数字之后有一个点,这意味着例如数字 3 实际上存储为 1.5*2
。我在上面的解释中省略了这一点,以使其更容易理解。
你可以在这里找到更多关于浮点数的信息(一般来说):每个计算机科学家都应该知道的关于浮点运算。
您可以在JS中想到52位整数,但请记住,按位逻辑运算符<code>