为什么处理1.0e+18量级数值时Python decimal代码报InvalidOperation错误
报错原因说明
这个异常是Decimal模块的精度规则和quantize方法的要求冲突导致的,具体原因如下:
- 首先,
quantize(Decimal("1E-10"))的作用是把数值精确到小数点后10位。你传入的数值是1.0e+18,它的整数部分有19位有效数字,加上需要保留的10位小数位,总共需要29位有效数字才能完整存储。 - Python的decimal模块默认上下文的精度(
getcontext().prec)仅为28位,刚好无法容纳29位的有效数字,因此会直接抛出InvalidOperation无效操作异常。
修复方案
只需要提前调高Decimal上下文的精度即可,示例代码如下:
from decimal import Decimal, getcontext # 调整精度到30位,足够容纳19位整数+10位小数的总位数 getcontext().prec = 30 M = 1.0e+18 print(M) M = float(Decimal(M).quantize(Decimal("1E-10"),rounding="ROUND_HALF_UP")) print(M)
注意:你当前的代码在处理完Decimal后又转回了float类型,而双精度float类型最多只能保证15-17位有效数字的精度,1.0e+18级别的数值本身已经无法精确存储小数位,因此这里的quantize操作转回float后不会保留10位小数的精度,如果需要高精度计算,建议全程使用Decimal类型,不要转回float。
内容的提问来源于stack exchange,提问作者Anita Steen
相关产品推荐
相关产品推荐

