This question询问JavaScript中的最高数字而不会丢失精度。在这里,我询问JavaScript中可表示的最高数字。对另一个问题的一些答案引用了这个问题的答案,但他们没有回答这个问题,所以我希望我在这里安全问。
我试图找到答案,但我中途迷路了。 JavaScript中可表示的最高数字似乎介于2 ^ 1023和2 ^ 1024之间。我用
进一步(在iojs REPL中)var highest = Math.pow(2, 1023);
for(let i = 1022; i > someNumber; i--) {
highest += Math.pow(2, someNumber);
}
这里的最高数似乎是someNumber
介于969和970之间。这意味着它介于(2 ^ 1023 + 2 ^ 1022 + ... + 2 ^ 970)和(2 ^ 1023 +之间) 2 ^ 1022 + ... + 2 ^ 969)。我不确定如何在没有内存不足和/或等待数年的循环或功能完成的情况下走得更远。
JavaScript中可表示的最高数字是多少? JavaScript是否存储了这个数字的所有数字,或仅存储了一些数字,因为每当我看到10 ^ 21或更高的数字时,它们都用科学记数法表示?为什么JavaScript代表这些极高的数字,特别是如果它可以记住"所有的数字? JavaScript不是一种基本的64种语言吗?
最后,为什么这是最高可表示的数字?我问,因为它不是2的整数指数。是因为它是一个浮点数吗?如果我们采用最高浮点数,那么它是否会与2的指数相关?
答案 0 :(得分:3)
ECMAScript使用IEEE 754 floating points来表示内存中的所有数字(整数和浮点数)。它使用double precision(64位),因此最大可能的数字将是以下(二进制):
(-1)^0 * (1.1111111111111111111111111111111111111111111111111111)_2 * 2^1023
^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^
sign bit 52 binary digits exponent
那是1.9999999999999997779553950749686919152736663818359375 * 2^1023
,它完全等于179769313486231570814527423734518473246981451219193357160576872808257310254570927992989173324623785766498017753719800531497718555288192667185248845624861831489179706103179456665410545164365169396987674822445002542175370097858557402467390846365155202987281348776667818932226328810501776426180817703854493120592.218308495538871112145305600
。这个数字在JavaScript中也可以Number.MAX_VALUE
。
答案 1 :(得分:2)
JavaScript使用IEE 754双精度浮点数,即binary64。此格式有1个符号位,11位指数和52位尾数。
最高可能的数字是使用最高可能的指数和尾数编码的数字,带有0符号位。除了7ff
(基数16)的指数值用于编码Infinity
和NaN
s。因此,最大数字编码为7fef ffff ffff ffff
,其值为(1 +(1 - 2 ^( - 52)))×2 ^ 1023。
有关该公式的更多详细信息,请参阅链接的文章。