# 大数危机

js 中除了会遇到精度丢失(比较常见),还有一个就是大数危机。当我们使用的数字超过了 js 能够表示的最大安全整数,我们得到的结果就不再准确了。

# 最大安全整数

最大的安全整数是 Number.MAX_SAFE_INTEGER(9007199254740991), 2^53 - 1.

如果超过这个范围,精度就变得不再准确,越大的数字跨越的将越大。

52 为的小数部分存储满了之后,跨越到指数部分,就会产生精度丢失了。

  1. 2^53

我们可以看出,当 2^53 的时候, 最后一位尾数为 0 的数字可以被准确表示, 而 1尾数的不能被精确表示, 这时候能够表示的精度比列是 1:2。

  1. 2^54 当为 2^54 的时候,这个时候, 只有最后两位尾数为00的可以被精确表示,这个时候精度能被正确表示的比例为 1:4。

# 总结

  • (2^53, 2^54) 之间的数会两个选一个,只能精确表示偶数.
  • (2^54, 2^55) 之间的数会四个选一个,只能精确表示4个倍数

会呈现一个倍数递增的关系,所以越大表示的精确数字越少。

# Infinity

在 js 中,有特殊值 Infinity, 用来表示无穷。

js 中指数表示正数的部分为 2^1024, 超出这个部分就会发生正向溢出,js 用Infinity来表示。

Math.pow(2, 1023);
8.98846567431158e+307

Math.pow(2, 1024);
Infinity