Python Decimal运算顺序不同导致结果差异的原因咨询
为什么两个计算结果最后一位不同?
问题出在Decimal模块的有效数字精度控制和运算顺序导致的中间舍入差异:
默认上下文设置:Python的
decimal.Decimal默认使用prec=28(保留28位有效数字),舍入模式为ROUND_HALF_EVEN(银行家舍入:当舍入位是5时,前一位为偶数则舍去,奇数则进1)。v和n的有效数字:你定义的
v和n都是28位有效数字(整数部分2位+小数部分26位),两者相加的原始结果是140.84383561643835616438356165,这是29位有效数字,超过了默认的28位精度限制。两种计算路径的差异:
- 路径1:r2 = 10 + (v + n)
- 先计算
v + n:29位结果被舍入到28位有效数字。由于舍入位是5,前一位是6(偶数),所以舍去5,得到vn = 140.8438356164383561643835616。 - 再加10,结果为
150.8438356164383561643835616,刚好28位有效数字,无需再舍入,直接输出。
- 先计算
- 路径2:r1 = 10 + v + n
- 先计算
10 + v:结果是103.93863013698630136986301369,29位有效数字,舍入到28位时,最后一位是9(大于5),进1得到103.9386301369863013698630137。 - 再加上
n:计算结果为150.84383561643835616438356166,29位有效数字,舍入到28位时,最后一位是6(大于5),进1得到150.8438356164383561643835617。
- 先计算
- 路径1:r2 = 10 + (v + n)
简单来说,因为分步计算时多了一次中间舍入,导致最终结果和合并计算的结果在最后一位出现差异。
内容的提问来源于stack exchange,提问作者Vahid
相关产品推荐
相关产品推荐

