広告

Java : MathContext - API使用例

MathContext (Java SE 18 & JDK 18) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。


概要

数値演算子(BigDecimalクラスによって実装されるものなど)の特定のルールを記述するコンテキスト設定をカプセル化する不変オブジェクト。

クラス構成

MathContextクラスは、

をカプセル化した 不変オブジェクト です。

主に BigDecimalクラスの演算で使います。

final var three = new BigDecimal(3);
System.out.println(three); // 3
System.out.println(three.scale()); // 0

// 10÷3を計算します。

{
    // MathContextを使わない例です。
    // 丸めモードはCEILING(正の無限大に近づくように丸める)です。
    System.out.println(BigDecimal.TEN.divide(three, RoundingMode.CEILING)); // 4
}

{
    // MathContextで3桁を指定します。
    final var mc = new MathContext(3, RoundingMode.CEILING);
    System.out.println(mc); // precision=3 roundingMode=CEILING
    System.out.println(BigDecimal.TEN.divide(three, mc)); // 3.34
}

{
    // 丸めモードをFLOOR(負の無限大に近づくように丸める)にします。
    final var mc = new MathContext(3, RoundingMode.FLOOR);
    System.out.println(mc); // precision=3 roundingMode=FLOOR
    System.out.println(BigDecimal.TEN.divide(three, mc)); // 3.33
}

関連記事:小数を誤差なしで計算 (BigDecimal)


フィールド

static final MathContext DECIMAL128

IEEE 754-2019 decimal128形式、34桁および端数処理モードHALF_EVENの精度と一致する精度設定を持つMathContextオブジェクト。

// precision=34 roundingMode=HALF_EVEN
System.out.println(MathContext.DECIMAL128);

static final MathContext DECIMAL32

IEEE 754-2019 decimal32形式、7桁および端数処理モードHALF_EVENの精度と一致する精度設定を持つMathContextオブジェクト。

// precision=7 roundingMode=HALF_EVEN
System.out.println(MathContext.DECIMAL32);

static final MathContext DECIMAL64

IEEE 754-2019 decimal64形式、16桁および端数処理モードHALF_EVENの精度と一致する精度設定を持つMathContextオブジェクト。

// precision=16 roundingMode=HALF_EVEN
System.out.println(MathContext.DECIMAL64);

static final MathContext UNLIMITED

無制限の精度での計算に必要な値が設定されているMathContextオブジェクトです。

// precision=0 roundingMode=HALF_UP
System.out.println(MathContext.UNLIMITED);

UNLIMITED(precision = 0) の場合は丸めモードが使用されず、割り切れない計算は例外が発生します。
詳細は BigDecimal (Java SE 18 & JDK 18) のAPI仕様をご確認ください。

// 10÷3を計算します。
final var three = new BigDecimal(3);
System.out.println(three); // 3

// ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
//BigDecimal.TEN.divide(three, MathContext.UNLIMITED);

コンストラクタ

MathContext (int setPrecision)

指定の精度とHALF_UP丸めモードの新しいMathContextを構築します。

final var mc = new MathContext(16);
System.out.println(mc); // precision=16 roundingMode=HALF_UP

MathContext (int setPrecision, RoundingMode setRoundingMode)

指定の精度と丸めモードの新しいMathContextを構築します。

final var mc = new MathContext(8, RoundingMode.CEILING);
System.out.println(mc); // precision=8 roundingMode=CEILING

MathContext (String val)

文字列から新しいMathContextを構築します。

final var mc = new MathContext("precision=32 roundingMode=FLOOR");
System.out.println(mc); // precision=32 roundingMode=FLOOR

メソッド

boolean equals (Object x)

このMathContextが指定されたObjectと同じかどうか比較します。

final var mc1 = new MathContext(8, RoundingMode.CEILING);
final var mc2 = new MathContext(8, RoundingMode.CEILING);

System.out.println(mc1 != mc2); // true
System.out.println(mc1.equals(mc2)); // true

final var mc3 = new MathContext(8, RoundingMode.FLOOR);
final var mc4 = new MathContext(4, RoundingMode.FLOOR);

System.out.println(mc1.equals(mc3)); // false
System.out.println(mc1.equals(mc4)); // false
System.out.println(mc3.equals(mc4)); // false

int getPrecision ()

precision設定を返します。

final var mc = new MathContext(32);
System.out.println(mc); // precision=32 roundingMode=HALF_UP
System.out.println(mc.getPrecision()); // 32

System.out.println(MathContext.DECIMAL64); // precision=16 roundingMode=HALF_EVEN
System.out.println(MathContext.DECIMAL64.getPrecision()); // 16

RoundingMode getRoundingMode ()

roundingMode設定を返します。

final var mc = new MathContext(8, RoundingMode.FLOOR);
System.out.println(mc); // precision=8 roundingMode=FLOOR
System.out.println(mc.getRoundingMode()); // FLOOR

System.out.println(MathContext.DECIMAL64); // precision=16 roundingMode=HALF_EVEN
System.out.println(MathContext.DECIMAL64.getRoundingMode()); // HALF_EVEN

int hashCode ()

このMathContextのハッシュ・コードを返します。

final var mc1 = new MathContext(8, RoundingMode.CEILING);
final var mc2 = new MathContext(8, RoundingMode.CEILING);

System.out.println(mc1 != mc2); // true
System.out.println(mc1.hashCode()); // -1237294828
System.out.println(mc2.hashCode()); // -1237294828

final var mc3 = new MathContext(8, RoundingMode.FLOOR);
final var mc4 = new MathContext(4, RoundingMode.FLOOR);

System.out.println(mc3.hashCode()); // -321581207
System.out.println(mc4.hashCode()); // -321581211

String toString ()

このMathContextの文字列表現を返します。

final var mc = new MathContext(8, RoundingMode.FLOOR);

final var str1 = mc.toString();
System.out.println(str1); // precision=8 roundingMode=FLOOR

final var str2 = MathContext.DECIMAL64.toString();
System.out.println(str2); // precision=16 roundingMode=HALF_EVEN

関連記事

ページの先頭へ