編程中的浮點(diǎn)數(shù)與二進(jìn)制
先來看一段簡單的代碼
打印結(jié)果如下:
為什么會(huì)出現(xiàn)這種詭異的答案呢?
這還得從浮點(diǎn)數(shù)的二進(jìn)制表示方法說起
這年頭兒,連過馬路的老奶奶估計(jì)都知道,計(jì)算機(jī)是采用二進(jìn)制計(jì)數(shù)的
來,簡單的考你一下:請把數(shù)字15寫成二進(jìn)制的形式
相信你對整數(shù)的二進(jìn)制已經(jīng)比較熟悉
但如果我換成小數(shù)呢?3.14159265359該怎么表示?
其實(shí),如果不搞底層設(shè)計(jì),一般人還真的不太知道這個(gè)答案
但你只有理解小數(shù)在二進(jìn)制中是如何表示的
才能夠明白文章開頭的案例【為什么0.1+0.2不等于0.3?】
我們以小數(shù)0.1為例,看看它在底層是如何轉(zhuǎn)換為二進(jìn)制存儲(chǔ)的
下圖展示了計(jì)算的過程 ↓

整數(shù)部分豎著連起來就是轉(zhuǎn)換后的二進(jìn)制
寫出來大概是這樣:
可以看到,1001 的部分,是無限循環(huán)的
我們用二進(jìn)制的小數(shù)把它寫出來大概是這樣
它相當(dāng)于

你會(huì)發(fā)現(xiàn),它并不等于0.1
它只是一個(gè)近似值
所以,二進(jìn)制保留的位數(shù)越多,精度也就越高

早期的計(jì)算機(jī)其實(shí)是不能處理浮點(diǎn)數(shù)的
直到IEEE 754 標(biāo)準(zhǔn)出現(xiàn)后,計(jì)算機(jī)才能處理浮點(diǎn)數(shù)
根據(jù)IEEE 754 標(biāo)準(zhǔn),float類型,共4個(gè)字節(jié),32個(gè)bit位

其中【指數(shù)部分】占8位,【小數(shù)部分】占23位
那么?指數(shù)部分?和?小數(shù)部分?分別用來保存什么呢?
我們依然以 數(shù)字 0.1 為例,我們剛才已經(jīng)得到了它的二進(jìn)制
按照IEEE 754標(biāo)準(zhǔn),我們需要把它的小數(shù)點(diǎn),向右移動(dòng)
直到整數(shù)部分是1為止
最終變成

-4 就是?指數(shù)部分
1001......就是?小數(shù)部分
小數(shù)點(diǎn)的位置不是固定的,而是浮動(dòng)的,故名:浮點(diǎn)數(shù)

?
了解到這一點(diǎn),你就能夠接受更多看起來奇怪而有趣的現(xiàn)象
比如
f1還原為10進(jìn)制,結(jié)果為0.40000000596046450000
d1還原為10進(jìn)制,結(jié)果為0.40000000000000000000
關(guān)于二進(jìn)制的底層,還有很多問題,有待我們探索
多了解一點(diǎn),就少一些困惑