當前位置: 妍妍網 > 辦公

0.1+0.2≠0.3,揭秘Python內建的Bug

2024-03-02辦公

朋友們,問一個簡單的問題: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.211.410000# 針對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