为何Number.MAX_VALUE加2**969仍等于自身?2**969是临界值吗?
问题解析
JavaScript里的Number是遵循IEEE 754标准的双精度浮点数,它的数值范围和精度由固定的二进制结构决定:1位符号位、11位指数位、52位尾数位。
1. Number.MAX_VALUE到底是什么?
Number.MAX_VALUE是双精度浮点数能表示的最大有限数,具体数值可以写成:
Number.MAX_VALUE = (2 - 2^-52) * 2^1023 = 2^1024 - 2^971
简单说,它的指数位已经用到了最大的合法值(比无穷大的指数少1),尾数位则是全1,已经没有多余的精度来表示更大的有限数了。
2. 浮点数的舍入规则
双精度浮点数计算时,如果结果没法精确表示,会按**“向最近的偶数舍入”**规则处理:要么舍入到最近的可表示值,要是刚好卡在两个值中间,就选尾数最后一位是偶数的那个。
对于Number.MAX_VALUE来说,它的下一个可表示的“值”就是Infinity(指数位再进位就会触发无穷大),两者之间的数值差是2^971。
3. 为什么两个表达式结果不同?
当给
Number.MAX_VALUE加2**969时:
这个增量比2^971的一半(也就是2^970)还小,按照舍入规则,结果会被“拉回”Number.MAX_VALUE,所以等式成立,输出true。当加
2**970时:
这个增量刚好是2^971的一半,触发舍入规则后,结果会被舍入到Infinity。而Infinity和Number.MAX_VALUE不相等,所以输出false。
4. 2**969是临界值吗?
不是。真正的临界值是2^970:
- 只要增量小于
2^970,结果都会被舍入成Number.MAX_VALUE; - 增量大于等于
2^970时,结果就会变成Infinity,不再等于原数。
内容的提问来源于stack exchange,提问作者Nemesis
相关产品推荐
相关产品推荐

