2012-04-05 43 views
3

我們來看看下面的Java代碼片段。爲什麼Java中兩個BigDecimal數字的劃分會拋出ArithmeticException?

package division; 

import java.math.BigDecimal; 

final public class Main 
{ 
    public static void main(String[] args) 
    { 
     BigDecimal a = new BigDecimal(2); 
     BigDecimal b = new BigDecimal(3); 

     System.out.println(a.multiply(b)); 
     System.out.println(a.add(b)); 
     System.out.println(b.subtract(a)); 
     System.out.println(a.divide(b)); 
    } 
} 

在上面的代碼片段中,除最後一個(除法)之外的所有操作都成功執行。試圖在Java中劃分兩個BigDecimal數字會引發java.lang.ArithmeticException。爲什麼?這個問題的解決方案是什麼?

+2

它似乎是這樣的:http://stackoverflow.com/questions/2749375/arithmeticexception-thrown-during-bigdecimal-divide – dexametason 2012-04-05 17:10:59

回答

9

BigDecimal#divide(BigDecimal) documentation

...如果準確的商值不能表示(因爲它具有非終止十進制擴展),則拋出ArithmeticException。

在您的具體情況「2/3」具有非十進制擴展(0.6666 ...),所以你必須使用divide()一種形式,這需要規模和/或RoundingMode來解決無限的表示。例如:

BigDecimal a = new BigDecimal(2); 
BigDecimal b = new BigDecimal(3); 
a.divide(b, 4, RoundingMode.CEILING); // => 0.6667 
a.divide(b, 4, RoundingMode.FLOOR); // => 0.6666 
1

如果你讀了javadoc它說,它會拋出一個java.lang.ArithmeticException如果準確的商值沒有十進制擴展。 2/3 = .666666666 ...並且不終止

1

返回值爲(this/divisor)且首選比例爲(this.scale() - divisor.scale())的BigDecimal;如果確切的商不能被表示(因爲它具有非終止的十進制擴展),則拋出ArithmeticException。

2/3 = 0.666666666666666666666 ........等等,並且它不能被表示。正如JavaDoc所說,它是一個非終止的十進制擴展

2

您會得到例外,因爲沒有確切的表示劃分結果。爲了解決這個問題,你需要使用過載隨着規模和舍入模式,就像這樣:

System.out.println(a.divide(b, 20, RoundingMode.HALF_UP)); 

這裏是your modified code on ideone

6 
5 
1 
0.66666666666666666667 
相關問題