Java java.mathパッケージのBigDecimalクラス
Java BigDecimalで加算、減算、乗算、除算、丸めを行う方法を紹介
BigDecimalの概要
Javaを使って浮動小数を計算するときは、BigDecimalクラスを使用する必要がある。
float型やdouble型を使用すると、誤差が発生する可能性がある。
厳密なお金の計算を行う場合、特に外貨などを扱う必要があるならBigDecimalクラスは必須である。
通常の変数を使う計算方法とは異なるため、慣れるまでは難しいと感じるかもしれない。しかし、厳密な計算を行うためには必要なので、覚えておく必要がある。
ここでは、Java BigDecimalで足し算、引き算、掛け算、割り算、丸めを行う方法を紹介する。
BigDecimalとは?
BigDecimalは、任意の長さの10進数の表現と計算を行うことができるクラスである。
整数部と小数点以下桁数(scale)の組み合わせで10進数を表現する。
- APIドキュメント
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
Warn
`BigDecimal divide = one.divide(three);`
この場合、丸め設定をしないと無限小数となり、`ArithmeticException`が発生する。
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の値と比較して小さい数を返す。 |