🌏
[Java] BigDecimal 無限循環小数が現る 停止不能の小数拡張
情報
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);
原因
あれこれ編
関連記事
本もある?
-
TODO: 端数処理方式 ↩︎
Discussion