Java java.mathパッケージのBigDecimalクラス

Java BigDecimalで加算、減算、乗算、除算、丸めを行う方法を紹介

BigDecimalの概要

Javaを使って浮動小数を計算するときは、BigDecimalクラスを使用する必要がある。

float型やdouble型を使用すると、誤差が発生する可能性がある。

厳密なお金の計算を行う場合、特に外貨などを扱う必要があるならBigDecimalクラスは必須である。
通常の変数を使う計算方法とは異なるため、慣れるまでは難しいと感じるかもしれない。しかし、厳密な計算を行うためには必要なので、覚えておく必要がある。

ここでは、Java BigDecimalで足し算、引き算、掛け算、割り算、丸めを行う方法を紹介する。

BigDecimalとは?

BigDecimalは、任意の長さの10進数の表現と計算を行うことができるクラスである。

整数部と小数点以下桁数(scale)の組み合わせで10進数を表現する。

BigDecimalの四則演算

BigDecimalでは、四則演算に対応する計算メソッドが提供されている。

メソッド 四則演算
add() 足し算
subtract() 引き算
multiply() 掛け算
divide() 割り算

それでは、例を見てみよう。

package com.devkuma.basic.bigdecimal;

import java.math.BigDecimal;
import java.math.RoundingMode;

public class BigDecimalArithmetic {
    public static void main(String[] args) {
        // BigDecimal 생성
        BigDecimal one = new BigDecimal("1.00");
        BigDecimal two = new BigDecimal("2.00");
        BigDecimal three = new BigDecimal("3.00");

        // 더하기 ( 1.0 + 2.0 )
        BigDecimal add = one.add(two);

        // 빼기 ( 1.0 - 2.0)
        BigDecimal subtract = one.subtract(two);

        // 곱하기 ( 2.0 * 3.0 )
        BigDecimal multiply = two.multiply(three);

        // 나누기 ( 1.0 / 3.0 소수 2자리 수를 반올림한다 )
        BigDecimal divide = one.divide(three, 2, RoundingMode.HALF_UP);

        System.out.println("더하기: " + add);
        System.out.println("빼기 : " + subtract);
        System.out.println("곱하기: " + multiply);
        System.out.println("나누기: " + divide);
    }
}

実行結果:

더하기: 3.00
빼기 : -1.00
곱하기: 6.0000
나누기: 0.33

BigDecimalの丸め方法

BigDecimalでは、切り上げ、切り捨て、四捨五入を含めて、次のような丸め方法を提供する。

計算メソッドで丸めを指定するほか、生成時に丸めを指定することもできる。 RoundingMode

丸め方法 説明
RoundingMode.CEILING 正の無限大に近づくようにする丸めモード
RoundingMode.DOWN 0に近づくようにする丸めモード
RoundingMode.FLOOR 負の無限大に近づくようにする丸めモード
RoundingMode.HALF_DOWN 四捨五入
RoundingMode.HALF_EVEN 末尾が偶数側になるように丸める
RoundingMode.HALF_UP 四捨五入
RoundingMode.UNNECESSARY 丸め不要
RoundingMode.UP 0から遠ざかるようにする丸めモード

それでは、例を見てみよう。

package com.devkuma.basic.bigdecimal;

import java.math.BigDecimal;
import java.math.RoundingMode;

public class BigDecimalRounding {

    public static void main(String[] args) {
        // BigDecimal 생성
        BigDecimal value = new BigDecimal(123.455);

        BigDecimal roundCeiling = value.setScale(2, RoundingMode.CEILING);
        BigDecimal roundDown = value.setScale(2, RoundingMode.DOWN);
        BigDecimal roundFloor = value.setScale(2, RoundingMode.FLOOR);
        BigDecimal roundHalfDown = value.setScale(2, RoundingMode.HALF_DOWN);
        BigDecimal roundHalfEven = value.setScale(2, RoundingMode.HALF_UP);
        BigDecimal roundUp = value.setScale(2, RoundingMode.UP);

        System.out.println("RoundingMode.CEILING: " + roundCeiling);
        System.out.println("RoundingMode.DOWN :" + roundDown);
        System.out.println("RoundingMode.FLOOR :" + roundFloor);
        System.out.println("RoundingMode.HALF_DOWN :" + roundHalfDown);
        System.out.println("RoundingMode.HALF_UP :" + roundHalfEven);
        System.out.println("RoundingMode.UP :" + roundUp);
    }
}

実行結果:

RoundingMode.CEILING: 123.46
RoundingMode.DOWN :123.45
RoundingMode.FLOOR :123.45
RoundingMode.HALF_DOWN :123.45
RoundingMode.HALF_UP :123.45
RoundingMode.UP :123.46

BigDecimalの符号

BigDecimalで数値の符号を取得する方法を紹介する。

package com.devkuma.basic.bigdecimal;

import java.math.BigDecimal;

public class BigDecimalSignum {

    public static void main(String[] args) {
        int plus = new BigDecimal(100).signum(); // 1
        int zero = new BigDecimal(0).signum(); // 0
        int minus = new BigDecimal(-100).signum(); // -1

        System.out.println(plus);
        System.out.println(zero);
        System.out.println(minus);
    }
}

実行結果:

1
0
-1
入力値 signum()戻り値
100(正数) 1
0(ゼロ) 0
-100(負数) -1

その他のBigDecimalメソッド

その他にも、次のようなメソッドが提供されている。

メソッド 説明
intValue() BigDecimal値をint型で返す。
longValue() BigDecimal値をlong型で返す。
floatValue() BigDecimal値をfloat型で返す。
doubleValue() BigDecimal値をdouble型で返す。
signum() BigDecimalの符号を返す。
負数: -1、ゼロ(0): 0、正数: 1
max(BigDecimal a) aの値と比較して大きい数を返す。
min(BigDecimal a) aの値と比較して小さい数を返す。