MAX_VALUE 和 MAX_SAFE_INTEGER的区别及相关知识

MAX_VALUE 和 MAX_SAFE_INTEGER是标准内置对象Number的静态属性

  • MAX_VALUE是所能表示的最大数值,1.7976931348623157e+308
  • MAX_SAFE_INTEGER是最大安全整数,9007199254740991

原因见下方

js中的数值使用IEEE754标准中的64双精度浮点数来表示

符号位阶码位小数位
11152
signexponentfraction
6362至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(偶数)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值