Skip to main content

decimal

decimal 提供高精度十进制定点与浮点运算,可避免二进制 float 带来的表示误差(如 0.1 + 0.2),适合金额、会计等对精度与舍入有要求的场景。设计符合通用十进制算术规范,参见 PEP 327

decimal

创建 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_EVENROUND_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