以下不會出現問題:
- System.out.println(new BigDecimal("1225.12").setScale(2));
- System.out.println(new BigDecimal("1225.1").setScale(2));
- System.out.println(new BigDecimal("1225").setScale(2));
System.out.println(new BigDecimal("1225.12").setScale(2)); System.out.println(new BigDecimal("1225.1").setScale(2)); System.out.println(new BigDecimal("1225").setScale(2));
如下代碼就是導致問題的原因:
- System.out.println(new BigDecimal("1225.120").setScale(2));//不會出錯
- System.out.println(new BigDecimal("1225.121").setScale(2));//出錯原因精度丟失問題,要指定舍入模式即可
System.out.println(new BigDecimal("1225.120").setScale(2));//不會出錯 System.out.println(new BigDecimal("1225.121").setScale(2));//出錯原因精度丟失問題,要指定舍入模式即可
解決方案如下:
以下是源代碼,兩個方法設置舍入模式:
- public BigDecimal setScale(int newScale, RoundingMode roundingMode) {
- return setScale(newScale, roundingMode.oldMode);
- }
public BigDecimal setScale(int newScale, RoundingMode roundingMode) { return setScale(newScale, roundingMode.oldMode); }
- public BigDecimal setScale(int newScale, int roundingMode) {//代碼省略}
public BigDecimal setScale(int newScale, int roundingMode) {//代碼省略}
以下兩種都是一樣,前者是定義在enum類中的,后者是BigDecimal本類的定義的靜態常量。
- new BigDecimal("1225.125").setScale(2, RoundingMode.HALF_UP)
- new BigDecimal("1225.121").setScale(2,BigDecimal.ROUND_HALF_UP)
new BigDecimal("1225.125").setScale(2, RoundingMode.HALF_UP) new BigDecimal("1225.121").setScale(2,BigDecimal.ROUND_HALF_UP)
以上兩種方式解決了精度丟失的問題。