工作中,我們都會用到BigDecimal來進(jìn)行金額計算,但是他有許多坑,可能針對新手不注意的話,就給自己多加幾個bug了。一起來看看吧。
new BigDecimal()
還是BigDecimal#valueOf()
?
創(chuàng)建對象的時候應(yīng)該使用BigDecimal.valueOf(0.01);
new BigDecimal()
會有精度問題,所以建議使用字符串去創(chuàng)建對象而不是浮點類型,BigDecimal.valueOf()
底層使用的就是用字符串去創(chuàng)建對象。確保精度不會丟失。
BigDecimal中equals方法的實現(xiàn)會比較兩個數(shù)字的精度,而compareTo方法則只會比較數(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));
}
運行結(jié)果:
建議做除法等操作的時候,都寫上保留位數(shù)和取值方式。
public static void main(String[] args) {BigDecimal bigDecimal1 = new BigDecimal("1.0");
BigDecimal bigDecimal2 = new BigDecimal("3.0");
bigDecimal1.divide(bigDecimal2);
}
運行結(jié)果:
public static void main(String[] args) {BigDecimal bigDecimal = BigDecimal.valueOf(12345678902132123113213.12345678912345678);
//必要時,使用科學(xué)計數(shù)法
System.out.println(bigDecimal.toString());
//不使用科學(xué)計數(shù)法
System.out.println(bigDecimal.toPlainString());
//工程計算中經(jīng)常使用的記錄數(shù)字的方法,類似科學(xué)計數(shù)法,但要求是10的冪必須是3的倍數(shù)
System.out.println(bigDecimal.toEngineeringString());
}
String toString()
; // 有必要時使用科學(xué)計數(shù)法String toPlainString()
; // 不使用科學(xué)計數(shù)法String toEngineeringString()
; // 工程計算中經(jīng)常使用的記錄數(shù)字的方法,與科學(xué)計數(shù)法類似,但要求10的冪必須是3的倍數(shù)乘法滿足交換律是一個常識,但是在計算機的世界里,會出現(xià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)域,會產(chǎn)生非常大的金額差異。
最后有個關(guān)于金額計算的Money類maven坐標(biāo)
org.javamoney moneta 1.1
新建Money類CurrencyUnit cny = Monetary.getCurrency("CNY");
Money money = Money.of(1.0, cny);
// 或者 Money money = Money.of(1.0, "CNY");
//System.out.println(money);
金額運算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
可以看到,這個類對金額做了顯性的抽象,增加了金額的單位,也避免了直接使用BigDecimal的一些坑。
總結(jié)使用BigDecimal過程中,記住這些坑,使用正確的方法,讓你少走彎路,少加幾天班。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
名稱欄目:別在用BigDecimal給自己挖坑了!-創(chuàng)新互聯(lián)
標(biāo)題URL:http://jinyejixie.com/article8/dcggip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、軟件開發(fā)、商城網(wǎng)站、關(guān)鍵詞優(yōu)化、云服務(wù)器、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容