免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

別在用BigDecimal給自己挖坑了!-創(chuàng)新互聯(lián)

前言

工作中,我們都會(huì)用到BigDecimal來(lái)進(jìn)行金額計(jì)算,但是他有許多坑,可能針對(duì)新手不注意的話,就給自己多加幾個(gè)bug了。一起來(lái)看看吧。

成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),平壩企業(yè)網(wǎng)站建設(shè),平壩品牌網(wǎng)站建設(shè),網(wǎng)站定制,平壩網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,平壩網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。創(chuàng)建

new BigDecimal()還是BigDecimal#valueOf()

創(chuàng)建對(duì)象的時(shí)候應(yīng)該使用BigDecimal.valueOf(0.01);
new BigDecimal()會(huì)有精度問(wèn)題,所以建議使用字符串去創(chuàng)建對(duì)象而不是浮點(diǎn)類(lèi)型,BigDecimal.valueOf()底層使用的就是用字符串去創(chuàng)建對(duì)象。確保精度不會(huì)丟失。

等值比較

BigDecimal中equals方法的實(shí)現(xiàn)會(huì)比較兩個(gè)數(shù)字的精度,而compareTo方法則只會(huì)比較數(shù)值的大小。

public static void main(String[] args) {BigDecimal bigDecimal1 = new BigDecimal("1.0");
    BigDecimal bigDecimal2 = new BigDecimal("1.00");
    System.out.println(bigDecimal2.equals(bigDecimal1));
    System.out.println(bigDecimal2.compareTo(bigDecimal1));
}

運(yùn)行結(jié)果:

BigDecimal并不代表無(wú)限精度

建議做除法等操作的時(shí)候,都寫(xiě)上保留位數(shù)和取值方式。

public static void main(String[] args) {BigDecimal bigDecimal1 = new BigDecimal("1.0");
    BigDecimal bigDecimal2 = new BigDecimal("3.0");
    bigDecimal1.divide(bigDecimal2);
}

運(yùn)行結(jié)果:

BigDecimal轉(zhuǎn)String要小心
public static void main(String[] args) {BigDecimal bigDecimal = BigDecimal.valueOf(12345678902132123113213.12345678912345678);
    //必要時(shí),使用科學(xué)計(jì)數(shù)法
    System.out.println(bigDecimal.toString());
    //不使用科學(xué)計(jì)數(shù)法
    System.out.println(bigDecimal.toPlainString());
    //工程計(jì)算中經(jīng)常使用的記錄數(shù)字的方法,類(lèi)似科學(xué)計(jì)數(shù)法,但要求是10的冪必須是3的倍數(shù)
    System.out.println(bigDecimal.toEngineeringString());
}
  • String toString(); // 有必要時(shí)使用科學(xué)計(jì)數(shù)法
  • String toPlainString(); // 不使用科學(xué)計(jì)數(shù)法
  • String toEngineeringString(); // 工程計(jì)算中經(jīng)常使用的記錄數(shù)字的方法,與科學(xué)計(jì)數(shù)法類(lèi)似,但要求10的冪必須是3的倍數(shù)
執(zhí)行順序不能調(diào)換(乘法交換律失效)

乘法滿(mǎn)足交換律是一個(gè)常識(shí),但是在計(jì)算機(jī)的世界里,會(huì)出現(xiàn)不滿(mǎn)足乘法交換律的情況

BigDecimal a = BigDecimal.valueOf(1.0);
BigDecimal b = BigDecimal.valueOf(3.0);
BigDecimal c = BigDecimal.valueOf(3.0);
System.out.println(a.divide(b, 2, RoundingMode.HALF_UP).multiply(c)); // 0.990
System.out.println(a.multiply(c).divide(b, 2, RoundingMode.HALF_UP)); // 1.00

別小看這這0.01的差別,在匯金領(lǐng)域,會(huì)產(chǎn)生非常大的金額差異。

最后有個(gè)關(guān)于金額計(jì)算的Money類(lèi)

maven坐標(biāo)

org.javamoneymoneta1.1
新建Money類(lèi)
CurrencyUnit cny = Monetary.getCurrency("CNY");
Money money = Money.of(1.0, cny); 
// 或者 Money money = Money.of(1.0, "CNY");
//System.out.println(money);
金額運(yùn)算
CurrencyUnit cny = Monetary.getCurrency("CNY");
Money oneYuan = Money.of(1.0, cny);
Money threeYuan = oneYuan.add(Money.of(2.0, "CNY")); //CNY 3
Money tenYuan = oneYuan.multiply(10); // CNY 10
Money fiveFen = oneYuan.divide(2); //CNY 0.5
比較相等
Money fiveFen = Money.of(0.5, "CNY"); //CNY 0.5
Money anotherFiveFen = Money.of(0.50, "CNY"); // CNY 0.50
System.out.println(fiveFen.equals(anotherFiveFen)); // true

可以看到,這個(gè)類(lèi)對(duì)金額做了顯性的抽象,增加了金額的單位,也避免了直接使用BigDecimal的一些坑。

總結(jié)

使用BigDecimal過(guò)程中,記住這些坑,使用正確的方法,讓你少走彎路,少加幾天班。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

名稱(chēng)欄目:別在用BigDecimal給自己挖坑了!-創(chuàng)新互聯(lián)
標(biāo)題URL:http://m.newbst.com/article8/dcggip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)軟件開(kāi)發(fā)商城網(wǎng)站關(guān)鍵詞優(yōu)化云服務(wù)器品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站