天天看點

漲知識: Python計算0.1+0.2≠0.3?

作者:武沛齊  

出處:http://www.cnblogs.com/wupeiqi/

本文版權歸作者和部落格園共有

漲知識: Python計算0.1+0.2≠0.3?
漲知識: Python計算0.1+0.2≠0.3?

為啥會有上述圖檔的現象呢?其實是由于float底層存儲原理導緻,下面聽我娓娓道來。

第一步:浮點數轉換為二進制表示

  • 整數部分,直接轉換為二進制,即:`100111`
  • 小數部分,讓小數一直乘2,小于1則用結果繼續乘,大于1則結果減1繼續乘,等于1則結束。
漲知識: Python計算0.1+0.2≠0.3?

如果小數位是0.25就會比較簡單,例如:

0.25 * 2 = 0.5 // 小于1,則繼續乘

0.5 * 2 = 1 // 等于1,則結束

結束時,将相乘之後等結果的整數部分拼接起來,是以 0.25 的二進制表示:01

第二步:科學計數法表示二進制小數

注意:因為是二進制小數,是以底數是2。

漲知識: Python計算0.1+0.2≠0.3?

第三步:存儲

  • Float32,用32位的二進制來存儲一個浮點數。
  • Float64,用64位的二進制來存儲一個浮點數。

接下來,我們以float32為例:

漲知識: Python計算0.1+0.2≠0.3?

通過對浮點型的存儲原理的學習,了解到浮點型其實是一種非精确的表達小數的方式,因為他的fraction中有位數限制,超過就會忽略。

float64和float32類似,隻是用于表示各部分的位數不同而已,其中:`sign=1位`、`exponent=11位`、`fraction=52位`,也就意味着可以表示的範圍更大了。

總結

在開發中想精确的處理小數時,可以使用decimal。

漲知識: Python計算0.1+0.2≠0.3?
掃一掃下面的二維碼
免費領取10G的Python學習資料哦~




“掃一掃,領取Python學習資料”