Java中double值的計(jì)算精準(zhǔn)度問題

很多網(wǎng)上帖子都提到了BigDecimal,但是其實(shí)很多人在使用時(shí)都會(huì)用錯(cuò)。

double value1  = 0.9;
double value2 = 0.1;
BigDecimal b1 = new BigDecimal(value1);
BigDecimal b2 = new BigDecimal(value2);
b1.add(b2).doubleValue();

在實(shí)際使用過程中你會(huì)發(fā)現(xiàn)這樣使用還是會(huì)有精度問題婉弹。
大致的原因是:
BigDecimal(double val)將會(huì)把double型二進(jìn)制浮點(diǎn)型值精確的轉(zhuǎn)換成十進(jìn)制的BigDecimal荠卷。
你可能認(rèn)為java中用new BigDecimal(0.1)創(chuàng)建的BigDecimal應(yīng)該等于0.1(一個(gè)是1的無精度的值,一個(gè)是有精度的值)瑞你,但實(shí)際上精確的是等于0.1000000000000000055511151231257827021181583404541015625酪惭。這是因?yàn)?.1不能被double精確的表示(下面大概描述一下原理)。因此者甲,傳入構(gòu)造函數(shù)的值不是精確的等于0.1春感。
對(duì)與float也是同樣的道理。首先此函數(shù)會(huì)自動(dòng)進(jìn)行精度擴(kuò)展虏缸,將float類型的0.99轉(zhuǎn)成double類型的鲫懒,因?yàn)?.99本身就是無法用二進(jìn)制表示的,也就說無論你的精度是多少位刽辙,都無法用二進(jìn)制來精確表示0.99窥岩,或者你用二乘來判斷(0.992=1.98 0.982=1.960.96*2=1.92 。宰缤。颂翼。永遠(yuǎn)無法得到一個(gè)整數(shù))。這就是二進(jìn)制計(jì)算機(jī)的缺點(diǎn)慨灭,就如同十進(jìn)制也也無法表示1/3朦乏,1/6一樣。
所以在0.99f轉(zhuǎn)成double時(shí)氧骤,進(jìn)行了精度擴(kuò)展呻疹,變成了0.9900000095367432,而接著轉(zhuǎn)成字符串语淘,最后轉(zhuǎn)成BigDecimal.
解決方法:
所以在當(dāng)遇到需要涉及到精確計(jì)算的時(shí)候诲宇,如上面代碼所示际歼,要注意該構(gòu)造函數(shù)是一個(gè)精確的轉(zhuǎn)換,它無法得到與先調(diào)用Double.toString(double)方法將double轉(zhuǎn)換成String姑蓝,再使用BigDecimal(String)構(gòu)造函數(shù)一樣的結(jié)果鹅心。如果要達(dá)到這種結(jié)果,應(yīng)該使用new BigDecimal(Stringvalue) 或 BigDecimal.valueof( double value)

double value1  = 0.9;
double value2 = 0.1;
BigDecimal b1 = new BigDecimal(String.valueOf(value1));
BigDecimal b2 = new BigDecimal(String.valueOf(value2));
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纺荧,一起剝皮案震驚了整個(gè)濱河市旭愧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宙暇,老刑警劉巖输枯,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異占贫,居然都是意外死亡桃熄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門型奥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞳收,“玉大人,你說我怎么就攤上這事厢汹∶睿” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵烫葬,是天一觀的道長(zhǎng)界弧。 經(jīng)常有香客問我,道長(zhǎng)搭综,這世上最難降的妖魔是什么垢箕? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮设凹,結(jié)果婚禮上舰讹,老公的妹妹穿的比我還像新娘茅姜。我一直安慰自己闪朱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布钻洒。 她就那樣靜靜地躺著奋姿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪素标。 梳的紋絲不亂的頭發(fā)上称诗,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音头遭,去河邊找鬼寓免。 笑死癣诱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的袜香。 我是一名探鬼主播撕予,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蜈首!你這毒婦竟也來了实抡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤欢策,失蹤者是張志新(化名)和其女友劉穎吆寨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體踩寇,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡啄清,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了俺孙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盒延。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鼠冕,靈堂內(nèi)的尸體忽然破棺而出添寺,到底是詐尸還是另有隱情,我是刑警寧澤懈费,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布计露,位于F島的核電站,受9級(jí)特大地震影響憎乙,放射性物質(zhì)發(fā)生泄漏票罐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一泞边、第九天 我趴在偏房一處隱蔽的房頂上張望该押。 院中可真熱鬧,春花似錦阵谚、人聲如沸蚕礼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奠蹬。三九已至,卻和暖如春嗡午,著一層夾襖步出監(jiān)牢的瞬間囤躁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狸演,地道東北人言蛇。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像宵距,于是被迫代替她去往敵國和親猜极。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容