負(fù)數(shù)的小數(shù)部分怎么表示?
不管是什么數(shù), 在計(jì)算機(jī)中最終都會(huì)被轉(zhuǎn)化為 0 和 1 進(jìn)行存儲(chǔ), 所以需要弄明白以下幾點(diǎn)問(wèn)題
一個(gè)小數(shù)如何轉(zhuǎn)化為二進(jìn)制浮點(diǎn)數(shù)的二進(jìn)制如何存儲(chǔ)浮點(diǎn)數(shù)的二進(jìn)制表示首先我們要了解浮點(diǎn)數(shù)二進(jìn)制表示, 有以下兩個(gè)原則:
整數(shù)部分對(duì) 2 取余然后逆序排列小數(shù)部分乘 2 取整數(shù)部分, 然后順序排列0.1 的表示是什么?我們繼續(xù)按照浮點(diǎn)數(shù)的二進(jìn)制表示來(lái)計(jì)算0.1 * 2 = 0.2 整數(shù)部分取 00.2 * 2 = 0.4 整數(shù)部分取 00.4 * 2 = 0.8 整數(shù)部分取 00.8 * 2 = 1.6 整數(shù)部分取 10.6 * 2 = 1.2 整數(shù)部分取 10.2 * 2 = 0.4 整數(shù)部分取 0…
所以你會(huì)發(fā)現(xiàn), 0.1 的二進(jìn)制表示是 0.00011001100110011001100110011……00110011 作為二進(jìn)制小數(shù)的循環(huán)節(jié)不斷的進(jìn)行循環(huán).
這就引出了一個(gè)問(wèn)題, 你永遠(yuǎn)不能存下 0.1 的二進(jìn)制, 即使你把全世界的硬盤都放在一起, 也存不下 0.1 的二進(jìn)制小數(shù).
浮點(diǎn)數(shù)的二進(jìn)制存儲(chǔ)Python 和 C 一樣, 采用 IEEE 754 規(guī)范來(lái)存儲(chǔ)浮點(diǎn)數(shù). IEEE 754 對(duì)雙精度浮點(diǎn)數(shù)的存儲(chǔ)規(guī)范將 64 bit 分為 3 部分.
第 1 bit 位用來(lái)存儲(chǔ) 符號(hào), 決定這個(gè)數(shù)是正數(shù)還是負(fù)數(shù)然后使用 11 bit 來(lái)存儲(chǔ)指數(shù)部分剩下的 52 bit 用來(lái)存儲(chǔ)尾數(shù)double-precision_floating-point_format而且可以指出的是, double 能存儲(chǔ)的數(shù)的個(gè)數(shù)是有限的, double 能代表的數(shù)必然不超過(guò) 2^64 個(gè), 那么現(xiàn)實(shí)世界上有多少個(gè)小數(shù)呢? 無(wú)限個(gè). 計(jì)算機(jī)能做的只能是一個(gè)接近這個(gè)小數(shù)的值, 是這個(gè)值在一定精度下與邏輯認(rèn)為的值相等. 換句話說(shuō), 每個(gè)小數(shù)的存儲(chǔ)(但是不是所有的), 都會(huì)伴有精度的丟失.
浮點(diǎn)數(shù)計(jì)算的問(wèn)題現(xiàn)在我們可以回顧你提出的問(wèn)題
0.1 + 0.2 == 0.30.1 在計(jì)算機(jī)存儲(chǔ)中真正的數(shù)字是 0.10000000000000000555111512312578270211815834045410156250.2 是
0.2000000000000000111022302462515654042363166809082031250.3 是
0.299999999999999988897769753748434595763683319091796875
這就是為什么 0.1 + 0.2 != 0.3 的原因
至于 1.1 + 2.2 與之類似。