Python提供了decimal模組用於十進位數學計算,它具有以下特點:
- 提供十進位資料類型,並且儲存為十進位數序列;
- 有界精度:用於儲存數位位元是固定的,可以通過decimal.getcontext().prec=x 來設定,不同的數字可以有不同的精度
- 浮點:十進位小數點的位置不固定(但位元是固定的)
decimal的構建:
可以通過整數、字串或者元組構建decimal.Decimal,對於浮點數需要先將其轉換為字串
decimal的context:
decimal在一個獨立的context下工作,可以通過getcontext來擷取當前環境。例如前面提到的可以通過decimal.getcontext().prec來設定小數點精度(預設為28):
>>> from decimal import Decimal as D>>> from decimal import getcontext >>> getcontext()Context(prec=6, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999, capitals=1, flags=[Rounded, Inexact], traps=[DivisionByZero, InvalidOperation, Overflow])>>> getcontext().prec = 6 >>> D(1)/D(3) Decimal('0.333333')
decimal和float效能對比:
$: python -mtimeit -s 'from decimal import Decimal as D' 'D("1.2")+D("3.4")'$: python -mtimeit -s 'from decimal import Decimal as D' '1.2+3.4'
我在虛擬機器中測試前者耗時是後者的1.7k倍,但這在某些運算(例如財務運算)中是值得的,但如果要對非整數做上百次的運算,應堅持使用float。