Excel中SUMPRODUCT函数返回极小值(2.78E-17)而非0的原因咨询
解决SUMPRODUCT返回极小值而非0的问题
嘿,这个问题其实是浮点数精度误差导致的,完全是Excel底层存储数据的特性造成的,别担心,这不是你公式写错了!
为什么会出现这个情况?
Excel使用的是双精度浮点数来存储数值,而像0.04这种十进制小数,转换成二进制的时候是无限循环的小数,没办法被精确存储——就像我们用十进制没法精确表示1/3一样。虽然单个数值的误差极小,但当你把15个这样的误差累加起来后,就会出现像2.78E-17这种接近0的极小值,而不是理论上的精确0。
我们可以手动验证你的序列:
- 把每个概率和数值的乘积算出来:
0.04*-4=-0.16,0.08*-3=-0.24,……,0.04*4=0.16 - 把所有乘积相加,理论上正负项会完全抵消,结果为0,但因为每个小数的存储误差,最终SUMPRODUCT返回了这个极小的偏差值。
怎么解决这个问题?
这里有两个简单的方案可以让结果显示为0:
用ROUND函数修正结果
直接对SUMPRODUCT的结果进行四舍五入,保留足够的小数位(比如10位,远超过你的需求):=ROUND(SUMPRODUCT(B2:B16, C2:C16), 10)这样极小的误差会被直接舍去,返回0。
判断并替换极小值
如果担心四舍五入会影响其他非零结果,可以用IF函数判断结果是否足够接近0,再替换成0:=IF(ABS(SUMPRODUCT(B2:B16, C2:C16)) < 1E-10, 0, SUMPRODUCT(B2:B16, C2:C16))这里的
1E-10是一个很小的阈值,你可以根据自己的需求调整。
内容的提问来源于stack exchange,提问作者Confused Giraffe




