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

时间:2016-01-14 20:35:18

标签: javascript integer

  

Number.MAX_SAFE_INTEGER   9007199254740991

     

Number.MAX_VALUE   1.7976931348623157e + 308

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

6 个答案:

答案 0 :(得分:18)

Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2是可以在计算中安全使用的最大整数。

例如,Number.MAX_VALUE为真 - 任何大于MAX_SAFE_INTEGER的整数都不能始终准确地在内存中表示。所有位用于表示数字的数字。

另一方面,

FaceRecognizer是使用双精度浮点表示表示的最大数字。一般来说,数字越大,准确度越低。

维基百科上的更多信息double-precision floating point numbers

答案 1 :(得分:8)

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

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

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

  

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

尾数(指数)总是11位,(不是这样)超过10到308就足够了。

答案 2 :(得分:3)

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

他们与MIN_VALUEMIN_SAFE_INTEGER一起设置doubleint的可能数值范围,当您使​​用parseFloat(X)&& parseInt(X)

答案 3 :(得分:1)

MAX_VALUE是双(64位)
MAX_SAFE_INTEGER可以使用双(64位)的前53位 基本上javascript不支持很长时间。所以对于int数用它 32位整数容器。对于大于32位的数字,它将数字保存在一个双容器中,整数部分为53位,其余11位为尾数(保留浮点数的信息)。

答案 4 :(得分:0)

基本浮点数表示为:

digits * 2 ** movement

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

  

什么是Number.MAX_SAFE_INTEGER?

整数只能用0表示,然后数字包含52位数字,并且最多可以容纳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
  

什么是Number.MAX_VALUE?

如果您设置digits的所有位和movement的所有位,则会得到一个数字(2 ** 53 - 1),该数字向左移动2 ** 11,并且是可以存储在64位中的最大数字,所有大于Infinity

答案 5 :(得分:0)

MAX_SAFE_INTEGER的值为9007199254740991。该数字背后的原因是,JavaScript使用IEEE 754中指定的双精度浮点格式数字。它返回可以表示为2 ^ 53-1的最大安全整数值。

Safe是指能够精确表示整数并正确比较它们的能力。

例如:Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2的计算结果为true

另一方面,

MAX_VALUE的值大约为1.79E+308或2 ^ 1024。大于MAX_VALUE的值表示为Infinity。