python中精確的浮點數運算

起步

浮點數的一個廣泛的問題是它們不能精確的表示十進制數。code

>>> a = 4.2
>>> b = 2.1
>>> a + b
6.300000000000001
>>> (a + b) == 6.3
False
>>>

這是因爲底層 CPU 和 IEEE 754 標準經過本身的浮點單位去執行算術時的特徵。看似有窮的小數, 在計算機的二進制表示裏倒是無窮的。ip

通常狀況下,這一點點的小偏差是容許存在的。若是不能容忍這種偏差(好比金融領域),那麼就要考慮用一些途徑來解決這個問題了。ci

Decimal

使用這個模塊不會出現任何小偏差。字符串

>>> from decimal import Decimal
>>> a = Decimal('4.2')
>>> b = Decimal('2.1')
>>> a + b
Decimal('6.3')
>>> print(a + b)
6.3
>>> (a + b) == Decimal('6.3')
True

儘管代碼看起來比較奇怪,使用字符串來表示數字,可是 Decimal 支持全部經常使用的數學運算。 decimal 模塊容許你控制計算的每一方面,包括數字位數和四捨五入。在這樣作以前,須要建立一個臨時上下文環境來改變這種設定:get

>>> from decimal import Decimal, localcontext
>>> a = Decimal('1.3')
>>> b = Decimal('1.7')
>>> print(a / b)
0.7647058823529411764705882353
>>> with localcontext() as ctx:
...     ctx.prec = 3
...     print(a / b)
...
0.765
>>> with localcontext() as ctx:
...     ctx.prec = 50
...     print(a / b)
...
0.76470588235294117647058823529411764705882352941176
>>>

因爲 Decimal 的高精度數字天然也就用字符串來作展現和中轉。數學

總結

總的來講,當涉及金融領域時,哪怕是一點小小的偏差在計算過程當中都是不容許的。所以 decimal 模塊爲解決這類問題提供了方法。it

相關文章
相關標籤/搜索