You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用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):
    1. 第一步计算abs(Decimal(40) - Decimal(56.5))得到16.5,按2位有效数字舍入,前一位6是偶数,16.5舍入后为16
    2. 第二步计算16 / Decimal(56.5)得到约0.283,按2位有效数字舍入为0.28
    3. 第三步计算0.28 * Decimal(0.9)得到0.252,按2位有效数字舍入为0.25
    4. 最后乘100得到结果25
  • 普通计算器没有中间步骤的精度限制,全程用高精度运算:16.5 / 56.5 * 0.9 *100 ≈ 26.28,和Decimal运算结果自然有差异。

如果要得到和普通计算器一致的结果,把prec调大到足够的位数,比如getcontext().prec = 6,全部运算完成后再按需做小数位数的舍入即可。

内容的提问来源于stack exchange,提问作者asfa afs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 08:45:03