為什么在Python中,0.1 + 0.2 ≠ 0.3

大家好,我是一行
今天分享的文章來一個靈魂拷問,你知道在Python中,0.1 + 0.2 等于幾嗎?


為啥會有上述圖片的現(xiàn)象呢?其實是由于float底層存儲原理導致,下面聽我娓娓道來。
第一步:浮點數(shù)轉換為二進制表示
整數(shù)部分,直接轉換為二進制,即:`100111`
小數(shù)部分,讓小數(shù)一直乘2,小于1則用結果繼續(xù)乘,大于1則結果減1繼續(xù)乘,等于1則結束。

如果小數(shù)位是0.25就會比較簡單,例如:
0.25 * 2 = 0.5 // 小于1,則繼續(xù)乘
0.5 * 2 = 1 // 等于1,則結束
結束時,將相乘之后等結果的整數(shù)部分拼接起來,所以 0.25 的二進制表示:01
第二步:科學計數(shù)法表示二進制小數(shù)
注意:因為是二進制小數(shù),所以底數(shù)是2。

第三步:存儲
Float32,用32位的二進制來存儲一個浮點數(shù)。
Float64,用64位的二進制來存儲一個浮點數(shù)。
接下來,我們以float32為例:

通過對浮點型的存儲原理的學習,了解到浮點型其實是一種非精確的表達小數(shù)的方式,因為他的fraction中有位數(shù)限制,超過就會忽略。
float64和float32類似,只是用于表示各部分的位數(shù)不同而已,其中:`sign=1位`、`exponent=11位`、`fraction=52位`,也就意味著可以表示的范圍更大了。
總結
在開發(fā)中想精確的處理小數(shù)時,可以使用decimal。

作者:武沛齊 ?
出處:http://www.cnblogs.com/wupeiqi/
本文版權歸作者和博客園共有

推薦閱讀
(點擊標題可跳轉閱讀)
每天增加一個奇怪的知識
