doubleでは必要ありませんが、BigDecimalでは端数の処理を厳密に指定する必要があります。 算譜堂数式エバリュエータではBigDecimalの端数処理は以下の3つの要素で制御します。
項目 | 型 | 意味 | デフォルト |
---|---|---|---|
RoundPoint | 列挙体 | EVERYTIME(評価の都度端数処理)、FINAL(最後に端数処理)のいずれか。 | FINAL |
RoundingMode | 列挙体 | java.math.RoundingModeに指定された端数処理方法。 | HALF_UP(四捨五入) |
scale | int | 小数点以下桁数。この桁未満を端数処理する。 | 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で指定した小数点未満で切り上げる。 |