精品专区-精品自拍9-精品自拍三级乱伦-精品自拍视频-精品自拍视频曝光-精品自拍小视频

網站建設資訊

NEWS

網站建設資訊

別在用BigDecimal給自己挖坑了!-創新互聯

前言

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

成都創新互聯公司是一家集網站建設,平壩企業網站建設,平壩品牌網站建設,網站定制,平壩網站建設報價,網絡營銷,網絡優化,平壩網站推廣為一體的創新建站企業,幫助傳統企業提升企業形象加強企業競爭力??沙浞譂M足這一群體相比中小企業更為豐富、高端、多元的互聯網需求。同時我們時刻保持專業、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們為更多的企業打造出實用型網站。創建

new BigDecimal()還是BigDecimal#valueOf()

創建對象的時候應該使用BigDecimal.valueOf(0.01);
new BigDecimal()會有精度問題,所以建議使用字符串去創建對象而不是浮點類型,BigDecimal.valueOf()底層使用的就是用字符串去創建對象。確保精度不會丟失。

等值比較

BigDecimal中equals方法的實現會比較兩個數字的精度,而compareTo方法則只會比較數值的大小。

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));
}

運行結果:

BigDecimal并不代表無限精度

建議做除法等操作的時候,都寫上保留位數和取值方式。

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

運行結果:

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

乘法滿足交換律是一個常識,但是在計算機的世界里,會出現不滿足乘法交換律的情況

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的差別,在匯金領域,會產生非常大的金額差異。

最后有個關于金額計算的Money類

maven坐標

org.javamoneymoneta1.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的一些坑。

總結

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

你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧


本文題目:別在用BigDecimal給自己挖坑了!-創新互聯
文章源于:http://m.jcarcd.cn/article/dcggip.html
主站蜘蛛池模板: 日本三级全黄 | 国产片a| 欧美专区亚洲专区 | 精品精品| 国产黄大片| 9久热草极品 | 成人激情电影 | 中文字幕在线观看 | 91视频欧美国产 | 国产干b | 欧美日韩免费观看 | 国产在线视频奶水 | 国产精品亚洲专区 | 日本中文字幕精 | 国产精品女人一区 | 国产尤物在线观看 | 午夜福利免费体验区 | 成人免费网站 | 三区精品在线观看 | 日本成人高清 | 精品一区二区夜色 | 精品福利导航视频 | 国产传媒在线 | 91永久视频在线 | 欧美性活一级视频 | 91福利在线网 | 午夜不卡视频 | 99热在线精品8 | 欧美另类第一页 | 最新国产精品拍自在线观看 | 日韩手机看 | 午夜家庭影 | 国产日韩精品视频 | 精品在线一区91 | 日韩午夜福利在线 | 国产精品天干 | 日韩精品首页 | 日本专区在线观看 | 日韩真做片在线观看 | 日本在线视频 | 玖玖福利资源导航 |