js 中整数的安全范围是多少?

-253 + 1 ~ 253- 1
在ES6中,是Number.MIN_SAFE_INTEGER 和 Number.MAX_SAFE_INTEGER。

为什么是253-1

因为Javascript的数字存储使用了IEEE 754中规定的双精度浮点数数据类型,而这一数据类型能够安全存储 -253 + 1 到 253- 1之间的数值(包含边界值)。
这里安全存储的意思是指能够准确区分两个不相同的值.
eg:

1
2
Number.MIN_SAFE_INTEGER+1===Number.MIN_SAFE_INTEGER+2
// true

Basic and interchange formats
IEEE754
其中 binary64 就是 JavaScript 采用的格式。
以下是64位双精度的位布局
double-precision
63位是符号位,53~62位是指数位,0~52位是有效数。
Exponent encoding

e =000000000012=00116=1:21-1023=2-1022(smallest exponent for normal numbers)
e =011111111112=3ff16=1023:21023-1023=20(zero offset)
e =100000001012=40516=1029:21029-1023=26
e =111111111102=7fe16=2046:22046-1023=21023(highest exponent)
具有含义的指数:
000000000002=用来表示有符号的零(如果F = 0)和 subnormals(如果F ≠0);和00016
111111111112=用于表示∞(如果F = 0)和NaNs(如果F ≠0),7ff16
其中˚F是的小数部分有效数。所有位模式均为有效编码。

引申一下为什么 0.1 + 0.2 != 0.3

0.1 是 0 01111111011 1001100110011001100110011001100110011001100110011010
0.2 是 0 01111111100 1001100110011001100110011001100110011001100110011010
0.1+0.2是 0 01111111101 0011001100110011001100110011001100110011001100110100
即 0.30000000000000004
(至于0.1和0.2是如何转换成64位双精度的,可以参考这篇文章)