上一篇簡單的介紹了一下十進制定點和浮點算術,今天就來帶大家熟悉下用法:
基本使用
decimal
模組,並使用 getcontext()
方法查看當前的上下文設置:
from decimal import *
getcontext()
getcontext().prec = 7
創建 Decimal 實例
Decimal
對象可根據不同數據類型創建數字實例:
Decimal(10) # 整數
Decimal('10') # 字符串
Decimal('3.14') # 小數
Decimal(3.14) # 浮點數
Decimal((0, (3, 1, 4), -2)) # 元組
處理特殊值
Decimal
還能表示特殊值,如:
Decimal('NaN') # 非數字
Decimal('-Infinity') # 負無窮大
信號處理
FloatOperation
信號來處理浮點數轉換錯誤:
c = getcontext()
c.traps[FloatOperation] = True
Decimal(3.14)
精度和捨入
getcontext().prec = 6
Decimal('3.1415926535') + Decimal('2.7182818285')
# Decimal('5.85987')
getcontext().rounding = ROUND_UP
Decimal('3.1415926535') + Decimal('2.7182818285')
# Decimal('5.85988')
數學操作
Decimal
支持高精度的數學運算函數:
getcontext().prec = 28
Decimal(2).sqrt() # 開平方根
Decimal(1).exp() # 指數運算
Decimal('10').ln() # 自然對數
Decimal('10').log10() # 常用對數
量化數值
quantize()
函數來控制數值的精度和捨入方式:
Decimal('7.325').quantize(Decimal('.01'), rounding=ROUND_DOWN)
# Decimal('7.32')
Decimal('7.325').quantize(Decimal('1.'), rounding=ROUND_UP)
# Decimal('8')
上下文管理
myothercontext = Context(prec=60, rounding=ROUND_HALF_DOWN)
setcontext(myothercontext)
Decimal(1) / Decimal(7)
信號旗標
clear_flags()
來清除錯誤旗標:
setcontext(ExtendedContext)
getcontext().clear_flags()
Decimal(355) / Decimal(113)
陷阱設置
getcontext().traps[DivisionByZero] = 1
Decimal(1) / Decimal(0)
# Traceback (most recent call last):
# decimal.DivisionByZero: x / 0
小總結下:decimal
模組提供了處理精確數學運算的強大功能,用戶只需在初始設置上下文後便可輕鬆進行計算。