HOME > 誤差が出ない演算をする(BigDecimal)
誤差が出ない演算をする(BigDecimal)
float型やdouble型の浮動小数の計算では、誤差が出る可能性があります。
例えば下の2つの演算では両方とも結果は3分の2となるので同じ値が返るはずですが・・・
double val1 = 1.0 - (1.0 / 3.0); // 1-(1/3) → 3分の2
double val2 = 2.0 / 3.0; // → 3分の2
画面表示してみると微妙に誤差がでてしまいます。
val1 → 0.6666666666666667
val2 → 0.6666666666666666
金額計算等で絶対に誤差が許されない場合は、BigDecimal型を使って演算を行います。
ただし、BigDecimal型のパフォーマンスは悪いです。
サンプルソースコード
例)BigDecimalを使用した四則演算サンプル
- BigDecimalSample.java
-
import java.math.BigDecimal; public class BigDecimalSample { public static void main(String args[]) { //BigDecimalの生成 BigDecimal a = new BigDecimal("1.0"); BigDecimal b = new BigDecimal("2.0"); BigDecimal c = new BigDecimal("3.0"); //足し算(1.0 + 2.0) double val1 = a.add(b).doubleValue(); //引き算(1.0 - 2.0) double val2 = a.subtract(b).doubleValue(); //掛け算(2.0 × 3.0) double val3 = b.multiply(c).doubleValue(); //割り算(1.0 ÷ 3.0 を小数第3位で切上げ) double val4 = a.divide(c, 3, BigDecimal.ROUND_HALF_UP).doubleValue(); //画面表示 System.out.println(val1); System.out.println(val2); System.out.println(val3); System.out.println(val4); } }
実行結果
- コマンドプロンプト
- C:\>java BigDecimalSample 3.0 -1.0 6.0 0.333
主要メソッド
戻値型 | メソッド | 説明 |
---|---|---|
BigDecimal | add(BigDecimal a) | aを加算する |
BigDecimal | subtract(BigDecimal a) | aを減算する |
BigDecimal | multiply(BigDecimal a) | aを乗算する |
BigDecimal | divide(BigDecimal a, int b, int c) | aを除算する。条件として小数第b位で除算し、丸め方法はcとする。 ※丸め方法は定数で指定します。 定数の一覧はこちらをご覧ください。 |
int | intValue() | BigDecimal値をint型で返す |
long | longValue() | BigDecimal値をlong型で返す |
float | floatValue() | BigDecimal値をfloat型で返す |
double | doubleValue() | BigDecimal値をdouble型で返す |
int | signum() | BigDecimal値の符号を返す 負値:-1 ゼロ:0 正値:1 |
BigDecimal | max(BigDecimal a) | aの値と比較して大きいほうを返す |
BigDecimal | min(BigDecimal a) | aの値と比較して小さいほうを返す |
数値・演算カテゴリ