Java : MathContext - API使用例

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


概要

クラス構成

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 17 & JDK 17) の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

関連記事

ページの先頭へ