為什么在Python中,0.1 + 0.2 ≠ 0.3
點(diǎn)擊關(guān)注上方“SQL數(shù)據(jù)庫(kù)開發(fā)”,
設(shè)為“置頂或星標(biāo)”,第一時(shí)間送達(dá)干貨
今天分享的文章來一個(gè)靈魂拷問,你知道在Python中,0.1 + 0.2 等于幾嗎?


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

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

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

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

作者:武沛齊 ?
出處:http://www.cnblogs.com/wupeiqi/
本文版權(quán)歸作者和博客園共有
——End——
后臺(tái)回復(fù)關(guān)鍵字:1024,獲取一份精心整理的技術(shù)干貨 后臺(tái)回復(fù)關(guān)鍵字:進(jìn)群,帶你進(jìn)入高手如云的交流群。 推薦閱讀
為什么阿里巴巴禁止使用存儲(chǔ)過程? 一份非常完整的 MySQL 規(guī)范,速速收藏! 數(shù)據(jù)庫(kù)中為什么不推薦使用外鍵約束 阿里規(guī)定超過3張表,禁止JOIN,為何? MySQL 常用命令手冊(cè)
點(diǎn)擊「閱讀原文」了解SQL訓(xùn)練營(yíng)
