为何使用Python Decimal模块的代码输出25,与计算器结果26.28不符
为什么Python decimal模块代码输出25,普通计算器计算结果为26.28?
from decimal import * getcontext().prec = 2 targetPrice = 40 currentPrice = 56.5 winChance = 0.9 stopLoss = 23 lossChance = 0.1 expectancy =100 * abs(((Decimal(targetPrice) - Decimal(currentPrice)) / Decimal( currentPrice))) * Decimal(winChance) print(expectancy)
- 核心原因是代码设置了
getcontext().prec = 2,这个参数的作用是全局指定Decimal所有算术运算的有效数字保留位数为2,不是保留2位小数,且每一步运算完成后都会立即按这个精度做舍入,不是最后统一舍入。 - Decimal运算拆解(默认舍入模式为银行家舍入ROUND_HALF_EVEN):
- 第一步计算
abs(Decimal(40) - Decimal(56.5))得到16.5,按2位有效数字舍入,前一位6是偶数,16.5舍入后为16 - 第二步计算
16 / Decimal(56.5)得到约0.283,按2位有效数字舍入为0.28 - 第三步计算
0.28 * Decimal(0.9)得到0.252,按2位有效数字舍入为0.25 - 最后乘100得到结果25
- 第一步计算
- 普通计算器没有中间步骤的精度限制,全程用高精度运算:
16.5 / 56.5 * 0.9 *100 ≈ 26.28,和Decimal运算结果自然有差异。
如果要得到和普通计算器一致的结果,把prec调大到足够的位数,比如getcontext().prec = 6,全部运算完成后再按需做小数位数的舍入即可。
内容的提问来源于stack exchange,提问作者asfa afs
相关产品推荐
相关产品推荐

