为什么使用Python的decimal模块时0.02不等于精确的0.02?
问题结论
这不是decimal模块的bug,属于使用方式错误。
偏差产生的原因
你传入Decimal构造函数的0.02是Python原生的float类型,底层为双精度二进制浮点数。受限于二进制浮点数的存储规则,0.02这类十进制小数无法被精确存储,你写出0.02的那一刻,内存中实际存储的就已经是你看到的那段长尾数近似值。decimal模块只是如实还原了这个已经存在精度损失的float值,偏差在传入参数之前就已经产生,和decimal模块无关。
正确使用方式
需要精确表示十进制小数时,必须将数值以字符串格式传入Decimal构造函数,跳过float的精度损失环节:
import decimal print(decimal.Decimal("0.02")) # 输出:0.02
如果必须从float类型转换,可以调用Decimal.from_float()方法,但该方法会保留float本身的精度误差,仅适用于明确接受误差的场景。
内容的提问来源于stack exchange,提问作者Migs Panganiban
相关产品推荐
相关产品推荐

