MAX_VALUE 和 MAX_SAFE_INTEGER是标准内置对象Number的静态属性
- MAX_VALUE是所能表示的最大数值,1.7976931348623157e+308
- MAX_SAFE_INTEGER是最大安全整数,9007199254740991
原因见下方
js中的数值使用IEEE754标准中的64双精度浮点数来表示
符号位 | 阶码位 | 小数位 |
---|---|---|
1 | 11 | 52 |
sign | exponent | fraction |
63 | 62至52编号 | 51至0位编号(从右边开始为0) |
数值是以科学计数法进行储存,整数部分永远为1,exponent表示指数,fraction表示小数部分。
举例说明:
0 10000000111 0000000000000000000000000000000000000000000000000000
=》
1.0000000000000000000000000000000000000000000000000000 * 2 ^ (1031 - 1023) = 256
所以在标准下的最大数值是:0 11111111110 1111111111111111111111111111111111111111111111111111
= 1 * 2 ^ (2 ^ 11 - 1 - 1:特殊值 - 1023:偏正值 - 52:小数点偏移) * (2 ^ (52:小数位 + 1:隐含整数1) - 1)
= 1 * 2 ^ 971 * (2 ^ 53 - 1)
= 1.7976931348623157e+308
所以在标准下的最大安全数值是:2 ^ 53 - 1
= 9007199254740991
特殊值:IEEE754规定的三个特殊值
- 当指数位(阶码位)部分全为1(即2047),且尾数部分全为0时,表示的是正无穷大(+Infinity)。
- 若符号位为1,则表示负无穷大(-Infinity)。
- 若尾数(小数位)部分不全为0,则表示NaN(不是一个数字)。
偏正值 :因为,指数的值可能为正也可能为负,如果采用补码表示的话,全体符号位S和Exp自身的符号位将导致不能简单的进行大小比较。正因为如此,指数部分通常采用一个无符号的正数值存储。双精度的指数部分是−1022~+1023加上1023,指数值的大小从1~2046(0(2进位全为0)和2047(2进位全为1)是特殊值)。浮点小数计算时,指数值减去偏正值将是实际的指数大小。
小数点偏移:为方便计算,将科学计数法的小数转换成整数所产生的偏移,例:1.111111(40x1)111111 =》 1111111(40x1)111111
当超出这个数字的时候,小数位可能没有更多的位置来存储精度,可能将导致计算出错
经典面试题:Number.MAX_SAFE_INTEGER + 1 == Number.MAX_SAFE_INTEGER + 2
原因:由于计算后的2进制结果超过精度,所以需要进行向偶舍入,导致最终结果相同
Number.MAX_SAFE_INTEGER + 1
= 0 01111111111 11111(40x1)1111111+ 00000(40x0)0000001
= 0 01111111111 100000(40x0)0000000
进行向偶舍入
= 0 01111111111 100000(40x0)000000
Number.MAX_SAFE_INTEGER + 2
= 0 01111111111 11111(40x1)1111111+ 00000(40x0)0000010
= 0 01111111111 100000(40x0)0000001
进行向偶舍入
= 0 01111111111 100000(40x0)000000
向偶舍入:有效数字超出规定数位的多余数字是1001,它大于超出规定最低位的一半(即0.5),故最低位进1。如果多余数字是0111,它小于最低位的一半,则舍掉多余数字(截断尾数、截尾)即可。对于多余数字是1000、正好是最低位一半的特殊情况,最低位为0则舍掉多余位,最低位为1则进位1、使得最低位仍为0(偶数)。