為什么float、double計算會精度缺失

為什么float、double計算會精度缺失?
答:
整數(shù)位的二進(jìn)制轉(zhuǎn)10進(jìn)制方式:1 * 2^n次方,
所以對于整數(shù)10進(jìn)制轉(zhuǎn)二級制,就用一直除2,余數(shù)再除2:
6
6 / 2 = 3
3/ 2 = 1 余1
1/ 2 = 0 余1
轉(zhuǎn)成二進(jìn)制為:110
對于任何一個整數(shù), 一直除2,肯定能除盡,最后余1。

可是對于小數(shù)的二進(jìn)制轉(zhuǎn)10進(jìn)制方式:* 1 * 2^-n次方。也就是相當(dāng)于 1/ 2^n方,是個除法。
所以對于小數(shù)10進(jìn)制轉(zhuǎn)二進(jìn)制,就會一直乘2,去掉進(jìn)位再乘2 。

比如0.625,整數(shù)位是0,小數(shù)位625會一直乘2,
625 * 2 = 125 進(jìn)了一位 1
25 * 2 = 50
50 * 2 = 100 進(jìn)了一位 1
所以小數(shù)位二進(jìn)制表示為:101

小數(shù)位二進(jìn)制101轉(zhuǎn)換成整數(shù)轉(zhuǎn)換方式為:
1 * 2^-1 + 0 * 2^-2 + 1 * 2^-3 = 0.5 + 0 + 1/ 8 = 0.5 + 0.125 = 0.625

可是對于小數(shù)10進(jìn)制轉(zhuǎn)2進(jìn)制,一直乘2。很容易一直乘下去,或者造成循環(huán),所以存儲位數(shù)用完了之后就只能0舍1入(因為到位數(shù)很靠后之后,可以舍去比如 1 * 2^-20 = 1 / 2^20無限趨近于0了)。
所以小數(shù)位表示的時候都存在約等于(0舍1入),再進(jìn)行運(yùn)算自然容易出現(xiàn)精度丟失的問題。**

比如0.3:
3 *2 = 6
6 * 2 = 12 進(jìn)一位 1
2 * 2 = 4
4 * 2 = 8
8 * 2 = 16 進(jìn)一位1
6 * 2 = 12 進(jìn)一位1
2 * 2 = 4 開始循環(huán)了
010011 010011 010011

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容