[ Java ] BigDecimal.divide で java.lang.ArithmeticException 例外

Pocket

Java の BigDecimal 型の数値を除算は divide メソッドを使用して行うことができます。しかし、結果が循環小数になってしまうケースでは java.lang.ArithmeticException 例外が発生してしまいます。

スポンサーリンク

例外が発生するコード
BigDecimal ten   = BigDecimal.TEN;    // 10
BigDecimal three = new BigDecimal(3); //  3
BigDecimal result;

// 10 ÷ 3 = 3.333・・   結果が循環小数となり、例外発生する
result = ten.divide(three);

/*
 * java.lang.ArithmeticException: 
 *   Non-terminating decimal expansion; no exact representable decimal result.
 */

理由は、指定したスケールが除算の結果を正確に表すには十分でないとのことのようです。計算が終わらないとの理由で例外が発生していました。意外と律儀でなんですね。融通が利かないとでも言うのでしょうか。。。

回避方法

回避するには出力する結果のスケールを指定します。devide メソッドの引数に小数点以下第何位までとするかを指定します。要するに、細かい結果は捨てていると言うことです。

BigDecimal ten   = BigDecimal.TEN;
BigDecimal three = new BigDecimal(3);
BigDecimal result;

//result = ten.divide(three);
result = ten.divide(three, 4, BigDecimal.ROUND_HALF_UP);

System.out.println(result);
// 3.3333
関連

「0.99999・・・=1」の証明 ( 循環小数と分数 ) 』 に、循環小数に関する記事もありますのでよろしければお読みください。プログラムの話ではありません。

 

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *