端数処理の指定

端数処理の制御方法

doubleでは必要ありませんが、BigDecimalでは端数の処理を厳密に指定する必要があります。 算譜堂数式エバリュエータではBigDecimalの端数処理は以下の3つの要素で制御します。

項目意味デフォルト
RoundPoint列挙体EVERYTIME(評価の都度端数処理)、FINAL(最後に端数処理)のいずれか。FINAL
RoundingMode列挙体java.math.RoundingModeに指定された端数処理方法。HALF_UP(四捨五入)
scaleint小数点以下桁数。この桁未満を端数処理する。10

デフォルトの端数処理方法は、上記の表にもあるように「評価の最後に小数点以下10桁未満を四捨五入」です。

端数処理の方法の変更

端数処理は方法は、FormulaEvaluatorのコンストラクタで指定するか、または、クリエイト後に メソッドで変更します。

コンストラクタで指定する方法
コンストラクタ意味
FormulaEvalutor(int scale)端数処理桁数を指定。端数処理方法、端数処理時点はデフォルト。
FormulaEvalutor(RoundPoint roundpoint,int scale,RoundingMode rMode)端数処理時点、端数処理桁数、端数処理方法を指定。

メソッドで変更する方法
メソッド意味
setScale(int scale)端数処理桁数を変更。端数処理方法、端数処理時点は変更しない。
setRounding(int scale,RoundingMode rMode)端数処理桁数、端数処理方法を変更。端数処理時点は変更しない。
setRounding(RoundPoint roundpoint,int scale,RoundingMode rMode)端数処理時点、端数処理桁数、端数処理方法を変更。

(変更例)

FormulaEvaluator formulaEvaluator = new FormulaEvaluator();
formulaEvaluator.setScale(2); //小数点2桁未満を端数処理するように変更

端数処理時点について

上述のとおり、端数処理時点はデフォルトでは「最後に端数処理」です。 この場合、計算の途中は全て任意精度、つまり、一切精度が落ちない方法で 計算し、計算の最後の値を1回だけ端数処理します。但し、結果が無限小数に なるような割算は例外で、この場合は任意精度の計算が出来ないため、 小数点以下20桁未満を四捨五入します。

端数処理時点を「評価の都度端数処理」に変更すると、全ての部分式の値を 出すたびに端数処理をします。下の例を参照してください。

FormulaEvaluator formulaEvaluator = new FormulaEvaluator();

//FINAL
formulaEvaluator.setRounding(RoundPoint.FINAL,2,RoundingMode.HALF_UP);
formulaEvaluator.bdEvaluate("1/3*3"); //最後に0.999..9が小数点2桁未満四捨五入され1.00になる。

//EVERYTIME
formulaEvaluator.setRounding(RoundPoint.EVERYTIME,2,RoundingMode.HALF_UP);
formulaEvaluator.bdEvaluate("1/3*3"); //1/3=0.33→0.33*3→0.99になる。


また、この場合システム定義定数、ユーザ定義定数もそれ単体で端数処理されますので注意してください。
//小数点2桁未満を都度端数処理するようにクリエイト
FormulaEvaluator formulaEvaluator = new FormulaEvaluator(RoundPoint.EVERYTIME,2,RoundingMode.HALF_UP);

formulaEvaluator.bdEvaluate("PI"); //3.14になる。

formulaEvaluator.defineUserConstant("CONST","1.2345");
formulaEvaluator.bdEvaluate("CONST"); //1.23になる。

端数処理の厳密なコントロール

上記のような全体としての端数処理のコントロールではなく、式の部分部分で都度 厳密な端数処理を行わなければならない場合には以下のシステム定義関数を式の中で 使用します。

メソッド意味
round(value,scale)valueをscaleで指定した小数点未満で四捨五入する。
down(value,scale)valueをscaleで指定した小数点未満で切り捨てる。
up(value,scale)valueをscaleで指定した小数点未満で切り上げる。

いずれの関数もscaleは整数でないと例外をスローします。