Python decimal 模塊使用方法詳解
-
模塊導入與基本創(chuàng)建
- 導入模塊:
from decimal import Decimal, getcontext - 創(chuàng)建
Decimal對象:- 推薦使用字符串初始化以避免浮點數(shù)精度問題:
price = Decimal('19.99') 正確 不推薦使用浮點數(shù)初始化:Decimal(0.1) 實際值為 0.1000000000000000055511151231257827021181583404541015625 - 其他創(chuàng)建方式:
d1 = Decimal(10) 從整數(shù)創(chuàng)建 d2 = Decimal('3.14') 從字符串創(chuàng)建 d3 = Decimal((0, (3, 1, 4), -2)) 從元組創(chuàng)建
- 推薦使用字符串初始化以避免浮點數(shù)精度問題:
- 導入模塊:
-
精度與上下文設置
- 獲取當前上下文:
ctx = getcontext() 獲取當前上下文對象 print(ctx) 輸出當前上下文配置 - 設置精度:
ctx.prec = 6 設置精度為6位有效數(shù)字 - 舍入模式:
ctx.rounding = 'ROUND_HALF_UP' 設置四舍五入模式
- 獲取當前上下文:
-
數(shù)學運算與舍入
- 基本運算:
total = Decimal('19.99') * Decimal('3') 結(jié)果為 Decimal('59.97') - 舍入操作:
tax = (Decimal('12.99') * Decimal('0.0875')).quantize(Decimal('0.00'), rounding='ROUND_HALF_UP') 結(jié)果為 Decimal('1.12') - 四舍五入模式:
-
ROUND_HALF_UP:四舍五入 -
ROUND_DOWN:直接截斷 -
ROUND_HALF_EVEN:銀行家舍入(偶數(shù)舍入) - 示例:
x = Decimal('-3.1415926535') print(x.quantize(Decimal('1.0000'), rounding='ROUND_HALF_EVEN')) 輸出 -3.1416
-
- 基本運算:
-
注意事項
- 浮點數(shù)轉(zhuǎn)換:
c = Decimal.from_float(22.222) 精確轉(zhuǎn)換浮點數(shù) - 字符串初始化:
d = Decimal('0.1') 精確存儲 0.1 - 性能與精度權(quán)衡:
高精度計算會帶來性能損失,需根據(jù)應用場景權(quán)衡。
- 浮點數(shù)轉(zhuǎn)換:
-
示例代碼
from decimal import Decimal, getcontext 設置上下文 ctx = getcontext() ctx.prec = 4 ctx.rounding = 'ROUND_HALF_UP' 創(chuàng)建 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')