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を使用した四則演算サンプル

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

主要メソッド

【java.math.BigDecimalクラス主要メソッド】
戻値型 メソッド 説明
BigDecimaladd(BigDecimal a)aを加算する
BigDecimalsubtract(BigDecimal a)aを減算する
BigDecimalmultiply(BigDecimal a)aを乗算する
BigDecimaldivide(BigDecimal a, int b, int c)aを除算する。条件として小数第b位で除算し、丸め方法はcとする。
※丸め方法は定数で指定します。
定数の一覧はこちらをご覧ください。
intintValue()BigDecimal値をint型で返す
longlongValue()BigDecimal値をlong型で返す
floatfloatValue()BigDecimal値をfloat型で返す
doubledoubleValue()BigDecimal値をdouble型で返す
intsignum()BigDecimal値の符号を返す
負値:-1 ゼロ:0 正値:1
BigDecimalmax(BigDecimal a)aの値と比較して大きいほうを返す
BigDecimalmin(BigDecimal a)aの値と比較して小さいほうを返す

数値・演算カテゴリ