java.lang.ArithmeticException: Rounding necessary


以下不會出現問題:

 

  1. System.out.println(new BigDecimal("1225.12").setScale(2));  
  2. System.out.println(new BigDecimal("1225.1").setScale(2));  
  3. 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));

如下代碼就是導致問題的原因:

 

  1. System.out.println(new BigDecimal("1225.120").setScale(2));//不會出錯  
  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));//出錯原因精度丟失問題,要指定舍入模式即可

解決方案如下:

以下是源代碼,兩個方法設置舍入模式:

 

  1. public BigDecimal setScale(int newScale, RoundingMode roundingMode) {  
  2.        return setScale(newScale, roundingMode.oldMode);  
  3.    }  
 public BigDecimal setScale(int newScale, RoundingMode roundingMode) {
        return setScale(newScale, roundingMode.oldMode);
    }
  1. public BigDecimal setScale(int newScale, int roundingMode) {//代碼省略}  
 public BigDecimal setScale(int newScale, int roundingMode) {//代碼省略}

以下兩種都是一樣,前者是定義在enum類中的,后者是BigDecimal本類的定義的靜態常量。

  1. new BigDecimal("1225.125").setScale(2, RoundingMode.HALF_UP)  
  2. 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)

以上兩種方式解決了精度丟失的問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM