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

Tadashi Shigeoka ·  Tue, June 24, 2014

JavaScript で浮動小数を計算する npm モジュール bigdecimal.js で、割り算を行う divide メソッド使ったらエラーが発生しました。

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

割り算の結果が、循環小数になる場合のエラーみたいです。

対応方法としては、循環小数になったときの処理を divide メソッドの第2、第3引数にしていしてあげればOKです。

var bigdecimal = require("bigdecimal");

// (1) 割り算の結果が、循環小数になるエラーの例
var one = new bigdecimal.BigDecimal(1);
var three = new bigdecimal.BigDecimal(3);
one.divide(three);
// java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result


// (2) エラーにならないように対応した例
// 割り算の結果を小数点第3位で四捨五入する場合は下記のような感じ
var HALF_UP = bigdecimal.RoundingMode.HALF_UP();
var result = one.divide(three, 2, HALF_UP);

result.floatValue();
// 0.33

ちょっと面倒ですが、厳密に値を扱えるのは良いですね。

参考情報