使用Python Decimal模块仍存在浮点错误,如何解决?
问题根源与解决方法
你的问题出在alpha的初始化方式:你用Decimal(.01)创建Decimal对象时,传入的是二进制浮点数.01——而0.01无法用二进制浮点数精确表示,这个浮点数本身就带有微小误差,转成Decimal后自然会保留这个误差,导致最终计算结果不精确。
修正方案
- 用字符串初始化Decimal类型的小数,避免二进制浮点误差:把
Decimal(.01)改成Decimal('0.01') - 去掉冗余的Decimal转换:表达式中
(1 - Decimal(alpha))里的Decimal(alpha)是多余的,alpha本身已经是Decimal类型,直接计算即可
修正后的代码:
from decimal import Decimal Demands = [9,12,8,11] fM = Decimal(10) alpha = Decimal('0.01') fM = (1 - alpha) * fM + alpha * Decimal(Demands[1 % 4]) print(fM)
运行结果
执行后会输出精确的10.02,完全消除浮点误差。
关键说明
Decimal的核心优势是精确表示十进制小数,但前提是你传入的初始值是精确的十进制表示。如果传入的是二进制浮点数(比如0.01、0.1这类无法精确表示的数),Decimal会保留浮点数本身的误差,达不到精确计算的目的。因此,初始化Decimal小数时,务必使用字符串而非浮点数。
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

