Python Decimal库为何出现精度误差?官方称可精确表示十进制数
问题原因
你观察到的现象和Decimal模块本身的高精度特性无关,核心是输入参数的类型错误导致的:
- 你传入
Decimal()的参数3.3是Python原生二进制浮点类型(float),这类数值在写入代码时就已经存在精度损失:十进制的3.3无法用有限长度的二进制浮点数精确表示,实际存储的是和3.3接近、存在微小误差的二进制值,我们平时看到的3.3只是Python做了显示截断后的结果,其真实存储的数值就是3.29999999999999982236431605997495353221893310546875。 - Decimal模块的设计逻辑是忠实还原输入参数的真实值:当你传入已经存在精度损失的float类型数值时,它只会完整保留该float自带的误差,不会自动修正输入参数本身的偏差,因此才会输出你看到的长串小数结果。
- 官方文档提到的「Decimal可以精确表示十进制数」有明确前提:需要给Decimal传入十进制的精确表达形式,最常用的就是字符串格式的数值。
正确使用方式
只需把数值用字符串包裹后传入Decimal,就能获得完全精确的十进制计算结果:
>>> from decimal import Decimal # 精确计算1.1+2.2 >>> Decimal('1.1') + Decimal('2.2') Decimal('3.3') # 精确生成3.3的Decimal实例 >>> Decimal('3.3') Decimal('3.3')
如果你的数值来源本身就是float类型,需要先将float转换为符合你预期精度的字符串后再传入Decimal,避免引入原生float的精度误差。
内容的提问来源于stack exchange,提问作者scotty-nukem
相关产品推荐
相关产品推荐

