朋友們,問一個簡單的問題:0.1+0.2=?
你肯定會說:中國人不騙中國人,0.1+0.2=0.3。
但是在Python裏,0.1+0.2≠0.3 ,我們今天一起來看看這個,並且看一下解決辦法。
離奇的錯誤
在python裏編寫下列程式碼,這個程式碼的含義我就不解釋了,我相信即使不懂編程你也能看懂。
編寫完成後,執行這個程式碼,你得到的結果是多少?
a=0.1
b=0.2
c=a+b
print(c) # 在螢幕上,輸出這個結果
我執行這個程式的輸出結果,如下圖所示,👇
為什麽會出現這個結果呢?
這和浮點數在電腦裏的表示方法有關,不只是Python有這個問題,其實其它程式語言也這樣。感興趣的朋友可以點贊本文,點贊滿20個,我就專門寫一篇文章來解釋這一現象的原因。
今天我們先來看一下,出現這種問題,應該如何解決。
有點復雜的解決方法。
這種小數點計算的誤差,平時我們可能也察覺不出來,但是這種微小的誤差,對於金融類對數位敏感的程式,影響就很大了。
比如我之前寫了一個開源計畫
pofinance
,可以透過一行程式碼計算量化交易中的做T盈虧,如下圖所示,👇
# pip install pofinance
import pofinance
good = pofinance.t0(11.2, 11.4, 10000) # 針對10000股,11.2買入,11.4賣出,能賺多少錢?
print(good)
其中t0的函式作用,是進行股票買入賣出的價格計算,經常會涉及到分甚至毫厘的價格計算,必須保證結果100%正確。
我是如何保證結果100%正確的呢?
使用Python裏內建的庫:decimal和內建函式str ,比如上面0.1+0.2的程式碼,如果想得到正確的結果,程式碼可以這麽寫。👇
from decimal import Decimal
a = Decimal(str(0.1)) # 先把0.1轉成字串,再把字串轉成數位
b = Decimal(str(0.2)) # 同上
c = a + b
print(c)
以上程式碼,執行後的結果,如下圖所示,👇
這個解決方法是不是有點復雜,我也覺得太復雜了。
但你還有沒有更好的辦法呢?歡迎在讀者群交流一下~👇
END