Java Bag fix ~ArithmeticException in BigDecimal~

ArithmeticExceptionが出ました。

これは、割り切れない処理を行ったときにです用です。
JavaDocを参照すると「1 / 3」を行うと出力されるようです。

【実行コード】

BigDecimal three = new BigDecimal(1);
BigDecimal four = new BigDecimal(3);
System.out.println(three.divide(four));

【エラーログ】

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

    at java.math.BigDecimal.divide(BigDecimal.java:1693)
    at jp.zenryoku.sample.statics.BigDecimalSample.test01(BigDecimalSample.java:14)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688)
    at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)

解決策

スケール指定と、まるめ算の指定を行うことで解決しました。

※注意スケールをセットしたら、そのBigDecimalクラスを返却します。

BigDecimal left = new BigDecimal(1);
BigDecimal right = new BigDecimal(3);
BigDecimal setScale = left.setScale(2);
BigDecimal res = setScale.divide(right, BigDecimal.ROUND_HALF_UP);
System.out.println(res.toString());

下のコードだとスケールを設定していない形になるのでエラーが出る。

BigDecimal left = new BigDecimal(1);
BigDecimal right = new BigDecimal(3);
left.setScale(2);
BigDecimal res = setScale.divide(right, BigDecimal.ROUND_HALF_UP);
System.out.println(res.toString());

投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す