什么是JS Number.MAX_SAFE_INTEGER和MAX_VALUE之间的区别?

Dan*_*obe 32 javascript integer

Number.MAX_SAFE_INTEGER 9007199254740991

Number.MAX_VALUE 1.7976931348623157e + 308

我理解如何MAX_SAFE_INTEGER基于JavaScript的双精度浮点运算来计算,但这个巨大的最大值来自何处?如果你使用全部63位作为指数而不是安全的11位,那么它是否会出现?

ibl*_*ish 27

Number.MAX_SAFE_INTEGER 是可以在计算中安全使用的最大整数.

例如,如果Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2是 - 任何大于MAX_SAFE_INTEGER的整数都不能总是准确地在内存中表示.所有位用于表示数字的数字.

Number.MAX_VALUE另一方面,是使用双精度浮点表示可能表示的最大数字.一般来说,数字越大,准确度越低.

更多信息维基百科上的双精度浮点数


Ily*_*lya 13

JS编号是内部64位浮点数(IEEE 754-2008).

MAX_SAFE_INTEGER是可以以该格式安全表示的最大整数,这意味着低于该值(以及MIN_SAFE_INTEGER以上)的所有数字都可以表示为整数.

MAX_VALUE来自2 ^ 1023(11位尾数减去尾数符号),即大约10 ^ 308.

如果你使用全部63位作为指数而不是安全的11位,那么它是否会出现?

尾数(指数)总是11位,(不是那么)超级到10 ^ 308就足够了.


Ego*_*ich 7

如您所知,javascript的类型为Number,但不是整数。整数按ducktyping功能显示在javascript中。所以Number.MAX_SAFE_INTEGER< Number.MAX_VALUE

当与&& 一起使用时MIN_VALUE,它们与一起并MIN_SAFE_INTEGER设置可能的Number值的范围。doubleintparseFloat(X)parseInt(X)


Fis*_*man 5

MAX_VALUE在double(64位)中
MAX_SAFE_INTEGER可以使用double(64位)中的前53位
基本上javascript不支持long。因此对于int数,它使用32位整数容器。对于大于32位的数字,将其保留在双精度容器中,该整数部分为53位,其余11位为尾数(保留浮点数的信息)。


Jon*_*lms 5

基本上,浮点数表示为:

digits * 2 ** movement
Run Code Online (Sandbox Code Playgroud)

数字(尾数)有52位(和1个“隐藏位”),移动有11位,并且两者一起形成一个64位数字(带有1个符号位)。这样,您可以表示各种不同的数字,因为您可以存储非常大的数字(较大的正向运动),非常小的数字(较大的负向运动)和整数(数字)。

什么是Number.MAX_SAFE_INTEGER?

整数可以通过设置移动方式来表示,即尾数实际上就是数字本身,然后数字包含52 + 1位数字,并且最多可以容纳2 ** 53 - 1数字(即Number.MAX_SAFE_INTEGER)。

现在,对于较大的数字,您必须使用移动,这基本上意味着您向左或向右移动数字,因此会失去准确性。

(想象一下digits,只需8位)

  number     >     digits | movement > result
  // savely represented
  11111111   >  11111111  | 0        > 11111111
  // lost the last 1
  111111111  >  11111111  | 1        > 111111110
  // lost the two last 1s
  1111111111 >  11111111  | 10       > 1111111100
Run Code Online (Sandbox Code Playgroud)

什么是Number.MAX_VALUE?

如果设置的所有位digits和的所有位movement,则会得到一个向左2 ** 53 - 1移动的数字(),它是2 ** 10 - 1可以存储在64位中的最大数字,所有较大的数字Infinity(表示为运动为2 ** 10,尾数为0)。