为什么Number.MAX_SAFE_INTEGER加不同精度小数结果不一致?
结果差异的核心原因
这个现象完全是双精度浮点数的存储规则和默认舍入机制导致的,具体可以拆解为两点:
- 双精度浮点数的精度是随数值量级动态变化的:它用1位符号、11位指数、52位尾数(隐含1位开头的1,总有效精度53位二进制)存储,数值越大,两个相邻可表示数的间隔(步长)越大:
- 在数值为2的量级时,步长极小,仅能区分差值大于
2^-51左右的两个数 - 在数值为
2^53的量级时,步长刚好为2,所以2^53 ~ 2^54区间内只能表示偶数,所有奇数都会被舍入到最近的偶数
- 在数值为2的量级时,步长极小,仅能区分差值大于
- 你写的两个小数字面量在解析阶段就已经被舍入为不同的值了,不是相加时才出现误差:
2.0000000000000001和2的差值小于2量级下的最小步长,解析时会直接被舍入为精确的2,所以N + 2.0000000000000001本质和N+2完全等价,结果自然相同,相加后的和为2^53 +1,处于2^53量级,按默认舍入规则(就近取偶)会被舍入为90071992547409922.000000000000001和2的差值已经超过了2量级下的最小步长,解析后会被舍入为一个大于2的可表示值,这个值加N后的总和,按舍入规则会被取到最近的偶数9007199254740994
内容的提问来源于stack exchange,提问作者lochiwei
相关产品推荐
相关产品推荐

