為啥會有上述圖片的現象呢?其實是由於float底層存儲原理導致,下面聽我娓娓道來。
第一步:浮點數轉換為二進制表示
- 整數部分,直接轉換為二進制,即:`100111`
- 小數部分,讓小數一直乘2,小於1則用結果繼續乘,大於1則結果減1繼續乘,等於1則結束。
如果小數位是0.25就會比較簡單,例如:
0.25 * 2 = 0.5 // 小於1,則繼續乘
0.5 * 2 = 1 // 等於1,則結束
結束時,將相乘之后等結果的整數部分拼接起來,所以 0.25 的二進制表示:01
第二步:科學計數法表示二進制小數
注意:因為是二進制小數,所以底數是2。
第三步:存儲
- Float32,用32位的二進制來存儲一個浮點數。
- Float64,用64位的二進制來存儲一個浮點數。
接下來,我們以float32為例:
通過對浮點型的存儲原理的學習,了解到浮點型其實是一種非精確的表達小數的方式,因為他的fraction中有位數限制,超過就會忽略。
float64和float32類似,只是用於表示各部分的位數不同而已,其中:`sign=1位`、`exponent=11位`、`fraction=52位`,也就意味着可以表示的范圍更大了。
總結
在開發中想精確的處理小數時,可以使用decimal。