Python decimal 模块使用方法详解
-
模块导入与基本创建
- 导入模块:
from decimal import Decimal, getcontext - 创建
Decimal对象:- 推荐使用字符串初始化以避免浮点数精度问题:
price = Decimal('19.99') 正确 不推荐使用浮点数初始化:Decimal(0.1) 实际值为 0.1000000000000000055511151231257827021181583404541015625 - 其他创建方式:
d1 = Decimal(10) 从整数创建 d2 = Decimal('3.14') 从字符串创建 d3 = Decimal((0, (3, 1, 4), -2)) 从元组创建
- 推荐使用字符串初始化以避免浮点数精度问题:
- 导入模块:
-
精度与上下文设置
- 获取当前上下文:
ctx = getcontext() 获取当前上下文对象 print(ctx) 输出当前上下文配置 - 设置精度:
ctx.prec = 6 设置精度为6位有效数字 - 舍入模式:
ctx.rounding = 'ROUND_HALF_UP' 设置四舍五入模式
- 获取当前上下文:
-
数学运算与舍入
- 基本运算:
total = Decimal('19.99') * Decimal('3') 结果为 Decimal('59.97') - 舍入操作:
tax = (Decimal('12.99') * Decimal('0.0875')).quantize(Decimal('0.00'), rounding='ROUND_HALF_UP') 结果为 Decimal('1.12') - 四舍五入模式:
-
ROUND_HALF_UP:四舍五入 -
ROUND_DOWN:直接截断 -
ROUND_HALF_EVEN:银行家舍入(偶数舍入) - 示例:
x = Decimal('-3.1415926535') print(x.quantize(Decimal('1.0000'), rounding='ROUND_HALF_EVEN')) 输出 -3.1416
-
- 基本运算:
-
注意事项
- 浮点数转换:
c = Decimal.from_float(22.222) 精确转换浮点数 - 字符串初始化:
d = Decimal('0.1') 精确存储 0.1 - 性能与精度权衡:
高精度计算会带来性能损失,需根据应用场景权衡。
- 浮点数转换:
-
示例代码
from decimal import Decimal, getcontext 设置上下文 ctx = getcontext() ctx.prec = 4 ctx.rounding = 'ROUND_HALF_UP' 创建 Decimal 对象 price = Decimal('19.99') quantity = Decimal('3') total = price * quantity Decimal('59.97') 舍入操作 tax_rate = Decimal('0.0875') tax = (price * tax_rate).quantize(Decimal('0.00')) Decimal('1.70')