🌏

[Java] BigDecimal 無限循環小数が現る 停止不能の小数拡張

2021/04/10に公開

情報

Exception in thread "main" java.lang.ArithmeticException:
Non-terminating decimal expansion; no exact representable decimal result.

意味:
停止不能の小数拡張; 正確に表現できる小数結果はありませんでした。

意訳:
精度未設定状態で無限循環小数結果に遭遇した。

対応策

divide(BigDecimal n, int scale, RoundingMode mode)で近似値を使う。

この方法の引数の意味:

  • BigDecimal n: 除数としてのBigDecimal対象
  • int scale: 結果の精度
  • RoundingMode mode: 端数処理方式。

解決方法

  • まずはRoundingModeという (クラス)を導入する (インポートする)
  • そして精度端数処理方式[1]を設定する (divideの第二と第三引数)
// You should have imported RoundingMode in the beginning
import java.math.RoundingMode;

x = big_deci_obj.divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP);
// Half up is only one mode in it.



x = big_deci_obj.divide(new BigDecimal("3"), 2);
x = big_deci_obj.divide(new BigDecimal("3"), 2, BigDecimal.ROUND_HALF_DOWN);

起こし例

代文(コード)例

// bi_fact can get factorial of i
// bi_fact returns BigInteger
BigDecimal bottom = new BigDecimal(bi_fact(3));
BigDecimal top = BigDecimal.ONE;

// result = 1 / bottom
BigDecimal result = top.divide(bottom);

原因

\dfrac{1}{3}は無限循環小数なので,対応しなければならない。

あれこれ編

関連記事

本もある?

脚注
  1. TODO: 端数処理方式 ↩︎

Discussion