Java : RoundingMode (丸めモード) - API使用例
RoundingMode (Java SE 21 & JDK 21) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様書のおともにどうぞ。
概要
RoundingMode は、数値の丸め動作をいろいろと定義した 列挙型 です。
厳密にはちょっと違うかもしれませんが、イメージしやすく言うと、切り上げ・切り捨て・四捨五入などです。
主に BigDecimalクラスの演算で使われます。
final var decimal = new BigDecimal("1.3");
System.out.println(decimal); // 1.3
// 小数部の桁数を 0桁 に丸めます。
// 切り上げ(正の無限大に近づくように丸めます)
final var ret1 = decimal.setScale(0, RoundingMode.CEILING);
System.out.println(ret1); // 2
// 切り捨て(負の無限大に近づくように丸めます)
final var ret2 = decimal.setScale(0, RoundingMode.FLOOR);
System.out.println(ret2); // 1
また、丸めを許容しない厳密な計算をしたい場合、UNNECESSARY が使えます。
丸めが発生する計算をすると、例外を発生させます。
列挙型定数
CEILING
final var decimals = List.of(
new BigDecimal("5.5"),
new BigDecimal("2.5"),
new BigDecimal("1.6"),
new BigDecimal("1.1"),
new BigDecimal("1.0"),
new BigDecimal("-1.0"),
new BigDecimal("-1.1"),
new BigDecimal("-1.6"),
new BigDecimal("-2.5"),
new BigDecimal("-5.5"));
decimals.forEach(decimal -> {
// 小数部の桁数を 0桁 に丸めます。
final var ret = decimal.setScale(0, RoundingMode.CEILING);
System.out.println(decimal + " : " + ret);
});
// 結果
// ↓
//5.5 : 6
//2.5 : 3
//1.6 : 2
//1.1 : 2
//1.0 : 1
//-1.0 : -1
//-1.1 : -1
//-1.6 : -1
//-2.5 : -2
//-5.5 : -5
DOWN
final var decimals = List.of(
new BigDecimal("5.5"),
new BigDecimal("2.5"),
new BigDecimal("1.6"),
new BigDecimal("1.1"),
new BigDecimal("1.0"),
new BigDecimal("-1.0"),
new BigDecimal("-1.1"),
new BigDecimal("-1.6"),
new BigDecimal("-2.5"),
new BigDecimal("-5.5"));
decimals.forEach(decimal -> {
// 小数部の桁数を 0桁 に丸めます。
final var ret = decimal.setScale(0, RoundingMode.DOWN);
System.out.println(decimal + " : " + ret);
});
// 結果
// ↓
//5.5 : 5
//2.5 : 2
//1.6 : 1
//1.1 : 1
//1.0 : 1
//-1.0 : -1
//-1.1 : -1
//-1.6 : -1
//-2.5 : -2
//-5.5 : -5
FLOOR
final var decimals = List.of(
new BigDecimal("5.5"),
new BigDecimal("2.5"),
new BigDecimal("1.6"),
new BigDecimal("1.1"),
new BigDecimal("1.0"),
new BigDecimal("-1.0"),
new BigDecimal("-1.1"),
new BigDecimal("-1.6"),
new BigDecimal("-2.5"),
new BigDecimal("-5.5"));
decimals.forEach(decimal -> {
// 小数部の桁数を 0桁 に丸めます。
final var ret = decimal.setScale(0, RoundingMode.FLOOR);
System.out.println(decimal + " : " + ret);
});
// 結果
// ↓
//5.5 : 5
//2.5 : 2
//1.6 : 1
//1.1 : 1
//1.0 : 1
//-1.0 : -1
//-1.1 : -2
//-1.6 : -2
//-2.5 : -3
//-5.5 : -6
HALF_DOWN
final var decimals = List.of(
new BigDecimal("5.5"),
new BigDecimal("2.5"),
new BigDecimal("1.6"),
new BigDecimal("1.1"),
new BigDecimal("1.0"),
new BigDecimal("-1.0"),
new BigDecimal("-1.1"),
new BigDecimal("-1.6"),
new BigDecimal("-2.5"),
new BigDecimal("-5.5"));
decimals.forEach(decimal -> {
// 小数部の桁数を 0桁 に丸めます。
final var ret = decimal.setScale(0, RoundingMode.HALF_DOWN);
System.out.println(decimal + " : " + ret);
});
// 結果
// ↓
//5.5 : 5
//2.5 : 2
//1.6 : 2
//1.1 : 1
//1.0 : 1
//-1.0 : -1
//-1.1 : -1
//-1.6 : -2
//-2.5 : -2
//-5.5 : -5
HALF_EVEN
final var decimals = List.of(
new BigDecimal("5.5"),
new BigDecimal("2.5"),
new BigDecimal("1.6"),
new BigDecimal("1.1"),
new BigDecimal("1.0"),
new BigDecimal("-1.0"),
new BigDecimal("-1.1"),
new BigDecimal("-1.6"),
new BigDecimal("-2.5"),
new BigDecimal("-5.5"));
decimals.forEach(decimal -> {
// 小数部の桁数を 0桁 に丸めます。
final var ret = decimal.setScale(0, RoundingMode.HALF_EVEN);
System.out.println(decimal + " : " + ret);
});
// 結果
// ↓
//5.5 : 6
//2.5 : 2
//1.6 : 2
//1.1 : 1
//1.0 : 1
//-1.0 : -1
//-1.1 : -1
//-1.6 : -2
//-2.5 : -2
//-5.5 : -6
HALF_UP
final var decimals = List.of(
new BigDecimal("5.5"),
new BigDecimal("2.5"),
new BigDecimal("1.6"),
new BigDecimal("1.1"),
new BigDecimal("1.0"),
new BigDecimal("-1.0"),
new BigDecimal("-1.1"),
new BigDecimal("-1.6"),
new BigDecimal("-2.5"),
new BigDecimal("-5.5"));
decimals.forEach(decimal -> {
// 小数部の桁数を 0桁 に丸めます。
final var ret = decimal.setScale(0, RoundingMode.HALF_UP);
System.out.println(decimal + " : " + ret);
});
// 結果
// ↓
//5.5 : 6
//2.5 : 3
//1.6 : 2
//1.1 : 1
//1.0 : 1
//-1.0 : -1
//-1.1 : -1
//-1.6 : -2
//-2.5 : -3
//-5.5 : -6
UNNECESSARY
final var decimals = List.of(
new BigDecimal("5.5"),
new BigDecimal("2.5"),
new BigDecimal("1.6"),
new BigDecimal("1.1"),
new BigDecimal("1.0"),
new BigDecimal("-1.0"),
new BigDecimal("-1.1"),
new BigDecimal("-1.6"),
new BigDecimal("-2.5"),
new BigDecimal("-5.5"));
decimals.forEach(decimal -> {
// 小数部の桁数を 0桁 に丸めます。
try {
final var ret = decimal.setScale(0, RoundingMode.UNNECESSARY);
System.out.println(decimal + " : " + ret);
} catch (ArithmeticException e) {
System.out.println(decimal + " : ArithmeticException!");
}
});
// 結果
// ↓
//5.5 : ArithmeticException!
//2.5 : ArithmeticException!
//1.6 : ArithmeticException!
//1.1 : ArithmeticException!
//1.0 : 1
//-1.0 : -1
//-1.1 : ArithmeticException!
//-1.6 : ArithmeticException!
//-2.5 : ArithmeticException!
//-5.5 : ArithmeticException!
UP
final var decimals = List.of(
new BigDecimal("5.5"),
new BigDecimal("2.5"),
new BigDecimal("1.6"),
new BigDecimal("1.1"),
new BigDecimal("1.0"),
new BigDecimal("-1.0"),
new BigDecimal("-1.1"),
new BigDecimal("-1.6"),
new BigDecimal("-2.5"),
new BigDecimal("-5.5"));
decimals.forEach(decimal -> {
// 小数部の桁数を 0桁 に丸めます。
final var ret = decimal.setScale(0, RoundingMode.UP);
System.out.println(decimal + " : " + ret);
});
// 結果
// ↓
//5.5 : 6
//2.5 : 3
//1.6 : 2
//1.1 : 2
//1.0 : 1
//-1.0 : -1
//-1.1 : -2
//-1.6 : -2
//-2.5 : -3
//-5.5 : -6
メソッド
static RoundingMode valueOf (int rm)
BigDecimalの丸めモード定数は、すべて非推奨となっています。
そのため、基本的に本メソッドを使うことはないと思います。
System.out.println(RoundingMode.valueOf(BigDecimal.ROUND_CEILING)); // CEILING
System.out.println(RoundingMode.valueOf(BigDecimal.ROUND_HALF_DOWN)); // HALF_DOWN
static RoundingMode valueOf (String name)
System.out.println(RoundingMode.valueOf("CEILING")); // CEILING
System.out.println(RoundingMode.valueOf("FLOOR")); // FLOOR
static RoundingMode[] values ()
for (final var value : RoundingMode.values()) {
System.out.println(value);
}
// 結果
// ↓
//UP
//DOWN
//CEILING
//FLOOR
//HALF_UP
//HALF_DOWN
//HALF_EVEN
//UNNECESSARY
Enumで宣言されたメソッド
clone, compareTo, describeConstable, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
「Java API 使用例 : Enum」をご参照ください。