为何1 + Number.MIN_VALUE等于1?相关数值精度问题问询
JavaScript浮点数精度问题解答
问题背景
你发现以下表达式结果均为true:
(1 + Number.MIN_VALUE) === 1Object.is(1 + Number.MIN_VALUE, 1)
根据MDN定义:
Number.MIN_VALUE是JavaScript中可表示的最小正数值静态属性。
问题1:既然Number.MIN_VALUE非零,为何与1相加后结果未变化?
JavaScript里的数字采用IEEE 754双精度浮点数存储,这种格式的有效精度是53位(52位显式尾数 + 1位隐含的最高位1)。当数值是1时,它的二进制是精确的1.0,而Number.MIN_VALUE实际是2^-1074——这个数值太小了,连1的尾数部分最后一位都影响不了,所以相加时会被直接舍去,结果还是1。
说白了就是:1的精度范围覆盖不了这么小的增量,加了跟没加没区别。
问题2:能使1相加后产生变化的最小数值是多少?
这个数值是Number.EPSILON,它的实际值为2^-52。
双精度浮点数对1的精度极限就是2^-52:任何比它小的正数加1,都会因超出精度范围被舍去;只有等于或大于它的数加1,才能得到比1大的最小可表示浮点数。验证一下:1 + Number.EPSILON !== 1 的结果为true,而且没有比Number.EPSILON更小的正数值能让这个等式成立。
内容的提问来源于stack exchange,提问作者RobertAKARobin
相关产品推荐
相关产品推荐

