首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JS Number.MAX_SAFE_INTEGER和MAX_VALUE有什么区别?

JS Number.MAX_SAFE_INTEGER和MAX_VALUE有什么区别?
EN

Stack Overflow用户
提问于 2016-01-15 04:35:18
回答 6查看 11.2K关注 0票数 48

Number.MAX_SAFE_INTEGER 9007199254740991

Number.MAX_VALUE 1.7976931348623157e+308

我知道MAX_SAFE_INTEGER是如何基于JavaScript的双精度浮点算法来计算的,但是这个巨大的最大值是从哪里来的?如果你使用所有的63位而不是安全的11位作为指数,它是不是得到的数字?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2016-01-15 04:49:57

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

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

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

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

票数 42
EN

Stack Overflow用户

发布于 2016-01-15 04:46:16

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

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

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

如果你使用所有的63位作为指数,而不是安全的11位,那么

是不是这个数字?

尾数(指数)总是11位(不是这样),令人惊讶的是,这对于10^308来说已经足够了。

票数 18
EN

Stack Overflow用户

发布于 2019-02-16 00:38:04

浮点数基本上表示为:

代码语言:javascript
复制
digits * 2 ** movement

数字(尾数)有52位(和1个"hidden bit"),移动有11位,两者一起形成一个64位的数字(带有1个符号位)。通过它,您可以表示各种不同的数字,因为您可以存储非常大的数字(大的正向移动)、非常小的数字(大的负移动)和整数(数字)。

什么是Number.MAX_SAFE_INTEGER?

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

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

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

代码语言:javascript
复制
  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 ** 10 - 1向左移动的数字(2 ** 53 - 1),这是可以存储在64位中的最大数字,所有更大的都是Infinity (表示为移动为2 ** 10,尾数为0)。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34799226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档