天天看點

1.2-1.0=0.19?Python中不可思議的錯誤,原來是浮點數計算的陷阱。

1.2-1.0=0.19?Python中不可思議的錯誤,原來是浮點數計算的陷阱。

我們先來看一個不可思議的錯誤:​

​1.2-1.0=0.19999999999999996​

1.2-1.0=0.19?Python中不可思議的錯誤,原來是浮點數計算的陷阱。

這是一個常見的錯誤,你遇到過嗎?今天我們就一起來分析一下:

  • 原因是什麼?
  • 如何得到正确的運算?
  • python中還有哪些意想不到的錯誤?

先說原因

如果你對計算機毫無了解,你可以跳過這部分,直接去看下一小節:如何得到正确的運算。

這是因為浮點數運算的特殊性決定的,其它程式設計語言也有這個問題。

Python的官方解釋器CPython(也就是你下載下傳到電腦上的Python安裝包的源碼) 中的 float 類型使用C語言的 double 類型進行存儲。float 對象的值是以固定的精度(通常為 53 位)存儲的二進制浮點數,由于 Python 使用 C 操作,而後者依賴于處理器中的硬體實作來執行浮點運算。

**簡單來說,許多可以輕松地用十進制表示的數字不能用二進制浮點表示。**1.2在電腦上存儲的值實際值是:​

​1.1999999999999999555910790149937383830547332763671875​

怎麼解決?

知道了原因,如何得到正确的結果呢?

不然文法知道一大堆,還是寫不好代碼;就像道理明白一大堆,依然過不好這一生一樣悲哀。

解決方法:使用python内置的decimal子產品
from decimal import Decimal

a = Decimal('1.2')
b = Decimal('1.0')
print(a - b)  # Decimal('0.2')

# 輸出結果:0.2      

這種方法的好處是精确計算,但也有一個壞處:影響計算速度。适用于你認為精度大于效率的時候,例如:金融行業。

1.2-1.0=0.19?Python中不可思議的錯誤,原來是浮點數計算的陷阱。

還有哪些常見錯誤?

  • ​​【Python新人】常見報錯及解決方案,看完少走3個月的彎路,建議收藏!​​
  • ​​Python官方整理的27個曆史遺留問題。​​