第48條:如果需要精確的答案,請避免使用float和double

??????? float和double主要為了科學(xué)計算和工程計算而設(shè)計留量,執(zhí)行二進(jìn)制浮點運算窄赋,這是為了在廣泛的數(shù)值范圍上提供較為精確的快速近似計算而精心設(shè)計的。然而楼熄,它們沒有提供完全精確的結(jié)果忆绰,所以不適合用于需要精確結(jié)果的場合,尤其是貨幣計算可岂。

//假設(shè)有1.03元,花掉0.42元后

System.out.println(1.03 - .42);//0.6100000000000001

System.out.println(1.00 - 9 * .10);//0.09999999999999998

使用舍入可以解決上面問題错敢,但并不是所有的問題都能用舍入解決,如有1元,有0.1稚茅,0.2纸淮,0.3,一直到1元的糖果亚享,從0.1開始買咽块,直到不能支付為止:

public static void main(String[] args) {

? ? double funds = 1.00;

? ? int itemsBought = 0;

? ? for(double price = .10; funds >= price; price += .10) {

? ? ? ? ? funds -= price;

? ? ? ? ? itemsBought++;

???? }

???? System.out.println(itemsBought + " items bought.");

????? System.out.println("Money left over: $" + funds);
}

結(jié)果是:

3 items bought.

Money left over: $0.3999999999999999

使用BigDecimal是正確的辦法

public static void main(String[] args) {

???? final BigDecimal TEN_CENTS = new BigDecimal(".10");

???? int itemsBought = 0;

???? BigDecimal funds = new BigDecimal("1.00");

???? for(BigDecimal price = TEN_CENTS; funds.compareTo(price) >= 0; price = price.add(TEN_CENTS)) {

????????? itemsBought++;

????????? funds = funds.subtract(price);

???? }

???? System.out.println(itemsBought + " items bought.");

???? System.out.println("Money left over: $" + funds);

}

結(jié)果是:

4 items bought.

Money left over: $0.00


使用BigDecimal的缺點是:1.與基本類型相比,不方便(需要創(chuàng)建BigDecimal對象)欺税;2.速度慢

使用int或者long侈沪,取決于涉及的數(shù)值大小,同時要自己處理十進(jìn)制小數(shù)晚凿,以分為單位亭罪,而不是以元為單位計算,就可以使用int來處理:

public static void main(String[] args) {

???? int itemsBought = 0;

???? int funds = 100;

???? for(int price = 10; funds >= price; price += 10) {

????????? itemsBought++;

????????? funds -= price;

????? }

???? System.out.println(itemsBought + " items bought.");

???? System.out.println("Money left over: $" + funds);
}

結(jié)果與用BigDecimal是一樣的歼秽。

總結(jié):對于需要精確答案的計算应役,不能使用float或者double,BigDecimal允許完全控制舍入燥筷,如果業(yè)務(wù)要求涉及多種舍入方式箩祥,使用BigDecimal很方便,如果性能很關(guān)鍵荆责,涉及的數(shù)值不大滥比,就可以使用int或者long亚脆,如果數(shù)值范圍沒有超過9位十進(jìn)制數(shù)字做院,可以使用int,如果不超過18位數(shù)字濒持,使用long键耕,如果數(shù)值可能超過18位,就必須用BigDecimal柑营。



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末屈雄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子官套,更是在濱河造成了極大的恐慌酒奶,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奶赔,死亡現(xiàn)場離奇詭異惋嚎,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)站刑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門另伍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绞旅,你說我怎么就攤上這事摆尝∥峦В” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵堕汞,是天一觀的道長勺爱。 經(jīng)常有香客問我,道長讯检,這世上最難降的妖魔是什么邻寿? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮视哑,結(jié)果婚禮上绣否,老公的妹妹穿的比我還像新娘。我一直安慰自己挡毅,他們只是感情好蒜撮,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著跪呈,像睡著了一般段磨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上耗绿,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天苹支,我揣著相機(jī)與錄音,去河邊找鬼误阻。 笑死债蜜,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的究反。 我是一名探鬼主播寻定,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼精耐!你這毒婦竟也來了狼速?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤卦停,失蹤者是張志新(化名)和其女友劉穎向胡,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惊完,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡僵芹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了专执。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淮捆。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出攀痊,到底是詐尸還是另有隱情桐腌,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布苟径,位于F島的核電站案站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏棘街。R本人自食惡果不足惜蟆盐,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望遭殉。 院中可真熱鬧石挂,春花似錦、人聲如沸险污。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛔糯。三九已至拯腮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚁飒,已是汗流浹背动壤。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留淮逻,地道東北人琼懊。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像弦蹂,于是被迫代替她去往敵國和親肩碟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

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

  • Java經(jīng)典問題算法大全 /*【程序1】 題目:古典問題:有一對兔子凸椿,從出生后第3個月起每個月都生一對兔子,小兔子...
    趙宇_阿特奇閱讀 1,864評論 0 2
  • 《Effective Java》這本書介紹了Java編程中78條極具使用價值的經(jīng)驗規(guī)劃翅溺,包括創(chuàng)建和銷毀對象脑漫,類和接...
    nanteschen閱讀 766評論 0 5
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法咙崎,內(nèi)部類的語法优幸,繼承相關(guān)的語法,異常的語法褪猛,線程的語...
    子非魚_t_閱讀 31,625評論 18 399
  • **2014真題Directions:Read the following text. Choose the be...
    又是夜半驚坐起閱讀 9,491評論 0 23
  • 摘下一片銀杏葉网杆,想做成書簽。 夾在日記里,夾在你我回憶的那一頁碳却。 那頁記錄了我們一起去過的銀杏林队秩,一起看過的風(fēng)景。...
    芝麻小圓子閱讀 330評論 0 0