BigDecimal類整除報錯的解決方案


例如:

BigDecimal num1 = new BigDecimal("10");  
  
BigDecimal num2 = new BigDecimal("3");  
  
BigDecimal num3 = num1.divide(num2);  
  
其實devide的函數定義如下  
  
BigDecimal.divide(BigDecimal divisor, int scale, RoundingMode roundingMode) ;  
  
scale為小數位數;  
  
roundingMode為小數模式;  

 

 

 

金額的數據類型是BigDecimal 
通過BigDecimal的divide方法進行除法時當不整除,出現無限循環小數時,就會拋異常的。

異常如下:

java.lang.ArithmeticException: Non-terminating decimal expansion; 
no exact representable decimal result. at java.math.BigDecimal.divide(Unknown Source)

 

應用場景:一批中供客戶的單價是1000元/年,如果按月計算的話1000/12=83.3333333333.... 

解決之道:就是給divide設置精確的小數點divide(xxxxx,2, BigDecimal.ROUND_HALF_EVEN) 

在 java中, 四舍五入通過 BigDecimal 來實現。一定要注意:BigDecimal is Immutable。也就是跟String一樣,對前一個的修改,比如setScale(), add()等都會返回一個新的BigDecimal.四舍五入舍入模式是 BigDecimal.ROUND_HALF_UP 

下面貼上一張圖:

 

 舉例說明:

ROUND_HALF_UP: 遇到.5的情況時往上近似,例: 1.5 ->;2
ROUND_HALF_DOWN : 遇到.5的情況時往下近似,例: 1.5 ->;1

BigDecimal a = new BigDecimal(1.5);
System.out.println("down="+a.setScale(0,BigDecimal.ROUND_HALF_DOWN)+"/tup="+a.setScale(0,BigDecimal.ROUND_HALF_UP));
結果:down=1  up=2

 


免責聲明!

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



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