Android 金錢(qián)計(jì)算 BigDecimal 的加減乘除計(jì)算

前言 :

今天正好做了一個(gè)購(gòu)物車(chē)的功能 所灸,涉及到了金錢(qián)的計(jì)算口糕,當(dāng)金錢(qián)計(jì)算時(shí)直接使用double搞挣,會(huì)損失精度带迟,需要使用BigDecimal 來(lái)進(jìn)行價(jià)格的計(jì)算。

關(guān)于Bigdecimal囱桨,這里整理一下方便以后學(xué)習(xí)仓犬,也希望能幫助到其他人。

BigDecimal的初始化

初始化時(shí)有兩種形式:第一種value舍肠,直接寫(xiě)int搀继、double、long之類(lèi)的數(shù)字翠语,第二種寫(xiě)String叽躯,在這里推薦使用第二種。

? ? ? ? BigDecimal bigDecimal=new BigDecimal(100);? //int

? ? ? ? BigDecimal bigDecima2=new BigDecimal(0.005);? //double

? ? ? ? BigDecimal bigDecima3=new BigDecimal(-100);?

? ? ? ? BigDecimal bigDecima4=new BigDecimal(1L);? //long

? ? ? ? BigDecimal bigDecima11=new BigDecimal("100");? //string

? ? ? ? BigDecimal bigDecima22=new BigDecimal("0.005");

? ? ? ? BigDecimal bigDecima33=new BigDecimal("-100");


BigDecimal的運(yùn)算——加減乘除

加法?add()函數(shù)

? ? ? ? //加法

? ? ? ? BigDecimal result1 = bigDecimal.add(bigDecima2);

? ? ? ? BigDecimal result11 = bigDecima11.add(bigDecima22);

? ? ? ? System.out.println("加法 value:"+result1);

? ? ? ? System.out.println("加法 string:"+result11);

減法subtract()函數(shù)

? ? ? ? //減法

? ? ? ? BigDecimal result2 = bigDecimal.subtract(bigDecima2);

? ? ? ? BigDecimal result22 = bigDecima11.subtract(bigDecima22);

? ? ? ? System.out.println("減法 value:"+result2);

? ? ? ? System.out.println("減法 string:"+result22);

乘法multiply()函數(shù)

? ? ? ? //乘法

? ? ? ? BigDecimal result3 = bigDecimal.multiply(bigDecima2);

? ? ? ? BigDecimal result33 = bigDecima11.multiply(bigDecima22);

? ? ? ? System.out.println("乘法 value:"+result3);

? ? ? ? System.out.println("乘法 string:"+result33);

除法divide()函數(shù)

? ? ? ? //除法

? ? ? ? BigDecimal result4 = bigDecimal.divide(bigDecima2,5,BigDecimal.ROUND_HALF_UP);

? ? ? ? BigDecimal result44 = bigDecima11.divide(bigDecima22,5,BigDecimal.ROUND_HALF_UP);

? ? ? ? System.out.println("除法 value:"+result4);

? ? ? ? System.out.println("除法 string:"+result44);

除法計(jì)算的時(shí)候肌括,括號(hào)里第一個(gè)參數(shù)是除數(shù)点骑,第二個(gè)是精確小數(shù)位,第三個(gè)是舍入模式

絕對(duì)值abs()函數(shù)

? ? ? ? //絕對(duì)值

? ? ? ? BigDecimal result5 = bigDecima3.abs();

? ? ? ? BigDecimal result55 = bigDecima33.abs();

? ? ? ? System.out.println("絕對(duì)值 value:"+result5);

? ? ? ? System.out.println("絕對(duì)值 string:"+result55);

?

大家可以看到,使用BigDecimal類(lèi)構(gòu)造方法傳入double類(lèi)型的數(shù)時(shí)畔况,其計(jì)算結(jié)果也不準(zhǔn)確鲸鹦,這是因?yàn)橛行└↑c(diǎn)數(shù)值不能夠被精確的表示成 double 類(lèi)型,一樣會(huì)損失精度跷跪,所以我在這里推薦大家使用String馋嗜。

除法的八種舍入模式

1、ROUND_UP

舍入遠(yuǎn)離零的舍入模式吵瞻。

在丟棄非零部分之前始終增加數(shù)字(始終對(duì)非零舍棄部分前面的數(shù)字加1)葛菇。

注意,此舍入模式始終不會(huì)減少計(jì)算值的大小橡羞。

2眯停、ROUND_DOWN

接近零的舍入模式。

在丟棄某部分之前始終不增加數(shù)字(從不對(duì)舍棄部分前面的數(shù)字加1卿泽,即截短)莺债。

注意,此舍入模式始終不會(huì)增加計(jì)算值的大小签夭。

3齐邦、ROUND_CEILING

接近正無(wú)窮大的舍入模式。

如果 BigDecimal 為正第租,則舍入行為與 ROUND_UP 相同;

如果為負(fù)措拇,則舍入行為與 ROUND_DOWN 相同。

注意慎宾,此舍入模式始終不會(huì)減少計(jì)算值丐吓。

4、ROUND_FLOOR

接近負(fù)無(wú)窮大的舍入模式趟据。

如果 BigDecimal 為正券犁,則舍入行為與 ROUND_DOWN 相同;

如果為負(fù),則舍入行為與 ROUND_UP 相同之宿。

注意族操,此舍入模式始終不會(huì)增加計(jì)算值。

5比被、ROUND_HALF_UP

向“最接近的”數(shù)字舍入色难,如果與兩個(gè)相鄰數(shù)字的距離相等,則為向上舍入的舍入模式等缀。

如果舍棄部分 >= 0.5枷莉,則舍入行為與 ROUND_UP 相同;否則舍入行為與 ROUND_DOWN 相同。

注意尺迂,這是我們大多數(shù)人在小學(xué)時(shí)就學(xué)過(guò)的舍入模式(四舍五入)笤妙。

6冒掌、ROUND_HALF_DOWN

向“最接近的”數(shù)字舍入,如果與兩個(gè)相鄰數(shù)字的距離相等蹲盘,則為上舍入的舍入模式股毫。

如果舍棄部分 > 0.5,則舍入行為與 ROUND_UP 相同;否則舍入行為與 ROUND_DOWN 相同(五舍六入)召衔。

7铃诬、ROUND_HALF_EVEN

向“最接近的”數(shù)字舍入,如果與兩個(gè)相鄰數(shù)字的距離相等苍凛,則向相鄰的偶數(shù)舍入趣席。

如果舍棄部分左邊的數(shù)字為奇數(shù),則舍入行為與 ROUND_HALF_UP 相同;

如果為偶數(shù)醇蝴,則舍入行為與 ROUND_HALF_DOWN 相同宣肚。

注意,在重復(fù)進(jìn)行一系列計(jì)算時(shí)悠栓,此舍入模式可以將累加錯(cuò)誤減到最小霉涨。

此舍入模式也稱(chēng)為“銀行家舍入法”,主要在美國(guó)使用闸迷。四舍六入嵌纲,五分兩種情況。

如果前一位為奇數(shù)腥沽,則入位,否則舍去鸠蚪。

以下例子為保留小數(shù)點(diǎn)1位今阳,那么這種舍入方式下的結(jié)果。

1.15>1.2 1.25>1.2

8茅信、ROUND_UNNECESSARY

斷言請(qǐng)求的操作具有精確的結(jié)果盾舌,因此不需要舍入。

如果對(duì)獲得精確結(jié)果的操作指定此舍入模式蘸鲸,則拋出ArithmeticException妖谴。

BigDecimal的輸出方式

有 int double long 和 string方式

? ? ? ? BigDecimal result666 =new BigDecimal("11");

? ? ? ? System.out.println("result666 int:"+result666.intValue());

? ? ? ? System.out.println("result666 double:"+result666.doubleValue());

? ? ? ? System.out.println("result666 long:"+result666.longValue());

? ? ? ? System.out.println("result666 string:"+result666.toString());

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市酌摇,隨后出現(xiàn)的幾起案子膝舅,更是在濱河造成了極大的恐慌,老刑警劉巖窑多,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仍稀,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡埂息,警方通過(guò)查閱死者的電腦和手機(jī)技潘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)遥巴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人享幽,你說(shuō)我怎么就攤上這事铲掐。” “怎么了值桩?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵迹炼,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我颠毙,道長(zhǎng)斯入,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任蛀蜜,我火速辦了婚禮刻两,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘滴某。我一直安慰自己磅摹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布霎奢。 她就那樣靜靜地躺著户誓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪幕侠。 梳的紋絲不亂的頭發(fā)上帝美,一...
    開(kāi)封第一講書(shū)人閱讀 50,096評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音晤硕,去河邊找鬼悼潭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛舞箍,可吹牛的內(nèi)容都是我干的舰褪。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼疏橄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼占拍!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起捎迫,我...
    開(kāi)封第一講書(shū)人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤晃酒,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后立砸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體掖疮,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年颗祝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浊闪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恼布。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖搁宾,靈堂內(nèi)的尸體忽然破棺而出折汞,到底是詐尸還是另有隱情,我是刑警寧澤盖腿,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布爽待,位于F島的核電站,受9級(jí)特大地震影響翩腐,放射性物質(zhì)發(fā)生泄漏鸟款。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一茂卦、第九天 我趴在偏房一處隱蔽的房頂上張望何什。 院中可真熱鬧,春花似錦等龙、人聲如沸处渣。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)罐栈。三九已至,卻和暖如春泥畅,著一層夾襖步出監(jiān)牢的瞬間荠诬,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工涯捻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浅妆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓障癌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親辩尊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子涛浙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351