1 a = 4.2 2 b = 2.1 3 4 a + b 5 6 (a + b) == 6.3
浮點數存在的一個問題,不能精確的表示十進制數。這是因爲底層 CPU 和 IEEE 754 標準經過本身的浮點單位去執行算術時的特徵。看似有窮的小數, 在計算機的二進制表示裏倒是無窮的。其實這不是Python的問題,而是實數的無限精度跟計算機的有限內存之間的矛盾。spa
舉個例子,假如說我只能使用整數(即只精確到個位,計算機內的浮點數也只有有限精度,以C語言中的雙精度浮點數double爲例,精度爲52個二進制位),要表示任意實數(無限精度)的時候我就只能經過舍入(rounding)來近似表示。3d
好比1.2我會表示成1,2.4表示成2,3.6表示成4.code
因此呢?blog
在算1.2 - 1.2的時候,因爲計算機表示的問題,我算的其實是1 - 1,結果是0,碰巧蒙對了;內存
在算1.2 + 1.2 - 2.4的時候,因爲計算機表示的問題,我算的其實是1 + 1 - 2,結果是0,再次蒙對了;ci
可是在算1.2 + 1.2 + 1.2 - 3.6的時候,因爲計算機表示的問題,我算的其實是1 + 1 + 1 - 4,結果是-1,運氣沒那麼好啦!字符串
這裏的1.2, 2.4, 3.6就至關於你問題裏的0.1, 0.2和0.3,1, 2, 4則是真正在計算機內部進行運算的數值,我說清楚了嗎?數學
另:不單單是浮點數的在計算機內部的表示有偏差,運算自己也可能會有偏差。好比整數2能夠在計算機內準確表示,可是要算根號2就有偏差了;再好比兩個浮點數相除,原本兩個數都是精確表示的,但除的結果精度卻超出了計算機內實數的表示範圍,而後就有偏差了。class
通常狀況下,這一點點的小偏差是容許存在的。若是不能容忍這種偏差(好比金融領域),那麼就要考慮用一些途徑來解決這個問題了。import
使用Decimal模塊就能夠解決這個問題。
1 from decimal import Decimal 2 a = Decimal('4.2') 3 b = Decimal('2.1') 4 a + b 5 6 print(a + b) 7 8 (a + b) == Decimal('6.3')
儘管代碼看起來比較奇怪,使用字符串來表示數字,可是 Decimal 支持全部經常使用的數學運算。總的來講,當涉及金融領域時,哪怕是一點小小的偏差在計算過程當中都是不容許的。所以 decimal 模塊爲解決這類問題提供了方法。