decimal
decimal 提供高精度十进制定点与浮点运算,可避免二进制 float 带来的表示误差(如 0.1 + 0.2),适合金额、会计等对精度与舍入有要求的场景。设计符合通用十进制算术规范,参见 PEP 327。
创建 Decimal
Decimal(value) 可从整数、字符串、元组或另一个 Decimal 构造。推荐用字符串构造,以保留精确的小数表示;用 float 构造会带入二进制浮点的误差。
from decimal import Decimal
Decimal(10) # Decimal('10')
Decimal('3.14') # 精确
Decimal(3.14) # 会带入 float 的表示误差
Decimal((0, (3, 1, 4), -2)) # 符号, 数字元组, 指数 → Decimal('3.14')
基本运算
支持加减乘除、比较等运算,行为与 int/float 类似,但 %、// 的余数符号遵循被除数(与规范一致)。Decimal 一般不与 float 直接混合运算,比较时可以与其它数字类型比较。
from decimal import Decimal
a, b = Decimal('1.34'), Decimal('2.50')
a + b # Decimal('3.84')
a * 2 # Decimal('2.68')
Decimal(-7) % Decimal(4) # Decimal('-3') 余数符号同被除数
精度与舍入
通过 getcontext().prec 设置有效位数,getcontext().rounding 设置舍入模式(如 ROUND_HALF_EVEN、ROUND_DOWN)。quantize(exp, rounding=...) 将结果舍入到指定指数(常用于保留小数位)。
from decimal import Decimal, getcontext, ROUND_DOWN, ROUND_HALF_EVEN
getcontext().prec = 6
Decimal(1) / Decimal(7) # Decimal('0.142857')
Decimal('7.325').quantize(Decimal('.01'), rounding=ROUND_DOWN) # Decimal('7.32')
getcontext().rounding = ROUND_HALF_EVEN
round(Decimal('3.75'), 1) # Decimal('3.8')
tip
金融、金额类计算推荐使用 Decimal 与字符串构造;科学计算或对性能要求高时可继续使用 float。