浮點(diǎn)精度問(wèn)題是怎么產(chǎn)生的?

浮點(diǎn)精度問(wèn)題是怎么產(chǎn)生的

對(duì)于小數(shù)的運(yùn)算,相信大家都有遇到過(guò)精度丟失問(wèn)題乾颁,利于0.1+0.2得到的是0.30000000000000004而不是0.3,那么如何解釋為什么計(jì)算機(jī)中 0.2 + 0.1 不等于 0.3 呢艺栈?在剖析這個(gè)問(wèn)題之前我們要先理解IEEE754標(biāo)準(zhǔn)英岭。

什么是IEEE754?下面是一段官方的解釋了解即可湿右,重點(diǎn)是我們要關(guān)注IEEE754存儲(chǔ)格式诅妹。

概念:IEEE二進(jìn)制浮點(diǎn)數(shù)算術(shù)標(biāo)準(zhǔn)(IEEE754)是20世紀(jì)80年代以來(lái)最廣泛使用的浮點(diǎn)數(shù)運(yùn)算標(biāo)準(zhǔn),為許多CPU與浮點(diǎn)運(yùn)算器所采用。這個(gè)標(biāo)準(zhǔn)定義了表示浮點(diǎn)數(shù)的格式(包括負(fù)零-0)與反常值(denormal number)吭狡,一些特殊數(shù)值(無(wú)窮∞與非數(shù)值NaN)尖殃,以及這些數(shù)值的“浮點(diǎn)數(shù)運(yùn)算符”。 常見的四種浮點(diǎn)數(shù)值表示方式:?jiǎn)尉_度(32位)划煮、雙精確度(64位)送丰、延伸單精確度(43比特以上,很少使用)與延伸雙精確度(79比特以上弛秋,通常以80位實(shí)現(xiàn))器躏。C語(yǔ)言的float通常是指IEEE單精確度,而double是指雙精確度蟹略。

存儲(chǔ)格式:IEEE 754標(biāo)準(zhǔn)準(zhǔn)確地定義了單精度和雙精度浮點(diǎn)格式

單精度浮點(diǎn)格式(32 位)登失。

雙精度浮點(diǎn)格式(64 位)。

EEE754 標(biāo)準(zhǔn)中規(guī)定 float 單精度浮點(diǎn)數(shù)在機(jī)器中表示用 1 位表示數(shù)字的符號(hào)科乎,用 8 位表示指數(shù)壁畸,用 23 位表示尾數(shù),即小數(shù)部分茅茂。對(duì)于 double 雙精度浮點(diǎn)數(shù)捏萍,用 1 位表示符號(hào),用 11 位表示指數(shù)空闲,52 位表示尾數(shù)令杈,其中指數(shù)域稱為階碼。IEEE754 浮點(diǎn)數(shù)的格式如下圖所示碴倾。

下面以0.1和0.2為例將其轉(zhuǎn)換為IEEE754的格式存儲(chǔ)到內(nèi)存中

0.1這個(gè)浮點(diǎn)數(shù)轉(zhuǎn)換成一個(gè)二進(jìn)制數(shù)0.00011001100110011...

0.2這個(gè)浮點(diǎn)數(shù)轉(zhuǎn)換成一個(gè)二進(jìn)制數(shù)0.0011001100110011...

這兩個(gè)浮點(diǎn)數(shù)無(wú)法精確轉(zhuǎn)換成一個(gè)二進(jìn)制數(shù)逗噩,由于在內(nèi)存中表示精度有限必須舍棄后面的尾數(shù)部分。

單精度為例0.1和0.2轉(zhuǎn)換為IEEE754格式以如下

0.1 : 0 01111011 10011001100110011001100

0.2:? 0 01111100 10011001100110011001100

所以我們看到0.1+0.2得到的是0.300000004而不是0.3的結(jié)論跌榔,而造成這個(gè)精度問(wèn)題的根本原因在于不是所有的數(shù)字(如例子中的0.1和0.2)都可以用二進(jìn)制表示而進(jìn)行截?cái)嘁煅悖斐删葋G失。

但是盡管如此我們還是有辦法在運(yùn)算是避免精度問(wèn)題僧须,那就是BigDecimal纲刀,那么BigDecimal是怎么解決這個(gè)問(wèn)題的呢?

解決方案就是不使用用二進(jìn)制担平,而是使用十進(jìn)制(BigInteger)+小數(shù)點(diǎn)位置(scale)來(lái)表示小數(shù),所有的十進(jìn)制數(shù)字都可以用這種形式來(lái)表示示绊,比如 0.1? =1*10^-1? ? ? scale=1

BigDecimal 運(yùn)算分成兩部分? ,BigInteger部分和更新scale即可暂论,具體有興趣的同學(xué)可以翻翻BigDecimal 的源碼面褐,在這里不再展開了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末取胎,一起剝皮案震驚了整個(gè)濱河市展哭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖匪傍,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坝咐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡析恢,警方通過(guò)查閱死者的電腦和手機(jī)墨坚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)映挂,“玉大人泽篮,你說(shuō)我怎么就攤上這事「檀” “怎么了帽撑?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)鞍时。 經(jīng)常有香客問(wèn)我亏拉,道長(zhǎng),這世上最難降的妖魔是什么逆巍? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任及塘,我火速辦了婚禮,結(jié)果婚禮上锐极,老公的妹妹穿的比我還像新娘笙僚。我一直安慰自己,他們只是感情好灵再,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布肋层。 她就那樣靜靜地躺著,像睡著了一般翎迁。 火紅的嫁衣襯著肌膚如雪栋猖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天汪榔,我揣著相機(jī)與錄音蒲拉,去河邊找鬼。 笑死揍异,一個(gè)胖子當(dāng)著我的面吹牛全陨,可吹牛的內(nèi)容都是我干的爆班。 我是一名探鬼主播衷掷,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼柿菩!你這毒婦竟也來(lái)了戚嗅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎懦胞,沒想到半個(gè)月后替久,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡躏尉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蚯根,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胀糜。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡颅拦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出教藻,到底是詐尸還是另有隱情距帅,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布括堤,位于F島的核電站碌秸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏悄窃。R本人自食惡果不足惜讥电,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望轧抗。 院中可真熱鬧允趟,春花似錦、人聲如沸鸦致。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)分唾。三九已至抗碰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绽乔,已是汗流浹背弧蝇。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留折砸,地道東北人看疗。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像睦授,于是被迫代替她去往敵國(guó)和親两芳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348