浮點數的一個廣泛的問題是它們不能精確的表示十進制數。code
>>> a = 4.2 >>> b = 2.1 >>> a + b 6.300000000000001 >>> (a + b) == 6.3 False >>>
這是因爲底層 CPU 和 IEEE 754 標準經過本身的浮點單位去執行算術時的特徵。看似有窮的小數, 在計算機的二進制表示裏倒是無窮的。ip
通常狀況下,這一點點的小偏差是容許存在的。若是不能容忍這種偏差(好比金融領域),那麼就要考慮用一些途徑來解決這個問題了。ci
使用這個模塊不會出現任何小偏差。字符串
>>> 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