一、背景
今天在計算庫存消耗百分比(消耗的庫存/總庫存)的時候遇到了一個錯誤,java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
通過異常的描述,我們知道這是因為,某些場景下對於如1/3會得到一個無窮小數,這個時候需要定義計算結果要保留到小數點后幾位,否則就會拋出上面的異常。
二、方法介紹
出現異常時使用的方法,此方法沒有精度設置。
public BigDecimal divide(BigDecimal divisor)
在進行除法運算的時候,我們需要使用下面的方法來進行精度控制。
public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
附:不要忘記判斷分母是否為0
三、代碼如下
BigDecimal b1 = new BigDecimal(1); BigDecimal b2 = new BigDecimal(3); if (!Objects.equals(b2, BigDecimal.ZERO)) { // 不能整除,數學上是無窮小數,拋出ArithmeticException異常 //BigDecimal b3 = b1.divide(b2); // 指定計算結果的精度,保留到小數點后幾位,以及舍入模式 BigDecimal b3 = b1.divide(b2, 4, BigDecimal.ROUND_HALF_UP); System.out.println(b3.toEngineeringString()); }