JAVA BigDecimal的相加 丟失精度問題
阿新 • • 發佈:2018-12-07
在處理BigDecimal 物件的 數值相加的問題上遇到麻煩,借鑑了 JAVA BigDecimal的相加 的文章,但是依然沒有解決我的問題。
其文章分析如下(純屬借鑑!)程式碼如下:
[java] view plain copy- BigDecimal totalAmount = new BigDecimal(0);
- totalAmount.add(new
- System.out.println(totalAmount);
輸出結果為0。
查資料後才知道,要這樣寫才行:
[java] view plain copy- BigDecimal totalAmount = new BigDecimal(
- totalAmount = totalAmount.add(new BigDecimal("5000"));
- System.out.println(totalAmount);
同時,在new一個BigDecimal物件的時候,最好傳入字串或者int型別的數字,因為傳入double型別的數字會有很神奇的事情發生,
比如說:
[java] view plain copy- BigDecimal totalAmount = new BigDecimal(0);
- totalAmount = totalAmount.add(new BigDecimal(0.59));
- System.out.println(totalAmount);
輸出結果:
0.58999999999999996891375531049561686813831329345703125
但是如果傳入的是String型別的數字:
[java] view plain copy- BigDecimal totalAmount = new BigDecimal(0);
- totalAmount = totalAmount.add(new BigDecimal("0.59"));
- System.out.println(totalAmount);
輸出結果:
0.59
上自己的:
BigDecimal productAmount = new BigDecimal(20);
BigDecimal taxAmount = new BigDecimal(2.38);
BigDecimal shippingAmount = new BigDecimal(0);
BigDecimal totalAmount = new BigDecimal(0);
totalAmount = totalAmount.add(new BigDecimal("" + productAmount.toString()));
totalAmount = totalAmount.add(new BigDecimal("" + taxAmount.toString()));
totalAmount = totalAmount.add(new BigDecimal("" + shippingAmount.toString()));
String priceVal = new java.text.DecimalFormat("######0.00")
.format(totalAmount.setScale(2, BigDecimal.ROUND_UP).doubleValue());
System.out.println(priceVal.toString());
這樣寫就完美的解決了我自己的問題!
詳細請參照此文:BigDecimal 的那些坑事兒