The MathContext
class provides multiple ways to create and initialize objects that define the precision and rounding mode for decimal arithmetic using BigDecimal
. The creation of a MathContext
object is typically done through its constructors, where you specify the number of significant digits (precision) and optionally the rounding behavior. When you instantiate a MathContext
, you’re essentially setting the rules for how numbers should be handled during calculations — for instance, whether results should be rounded up, down, or to the nearest value, and how many digits should be retained in the final output.
Java provides four overloaded constructors to create a MathContext
instance. You can either specify only the precision (which uses a default rounding mode of HALF_UP
), or you can provide both the precision and the desired rounding mode explicitly. There is also a constructor that takes a string representation, which is useful when reading configurations dynamically from a file or user input. Once a MathContext
object is created, it remains immutable, meaning the precision and rounding mode cannot be changed later. This design promotes thread safety and ensures consistent behavior across different parts of the application.
Constructors

Methods
Example Program: Demonstrating MathContext Creation and Use

import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; public class MathContextDemo { public static void main(String[] args) { // Constructor 1: Only precision, default rounding HALF_UP MathContext mc1 = new MathContext(4); // Constructor 2: Precision and custom rounding mode MathContext mc2 = new MathContext(3, RoundingMode.DOWN); // Constructor 3: Using string input MathContext mc3 = new MathContext("precision=5 roundingMode=CEILING"); // Constructor 4: Copy constructor MathContext mc4 = new MathContext(mc2); // BigDecimal to be used BigDecimal value = new BigDecimal("123.456789"); System.out.println("Original Value: " + value); System.out.println("Rounded with mc1 (precision=4, HALF_UP): " + value.round(mc1)); System.out.println("Rounded with mc2 (precision=3, DOWN): " + value.round(mc2)); System.out.println("Rounded with mc3 (precision=5, CEILING): " + value.round(mc3)); System.out.println("Rounded with mc4 (copy of mc2): " + value.round(mc4)); } } /* Original Value: 123.456789 Rounded with mc1 (precision=4, HALF_UP): 123.5 Rounded with mc2 (precision=3, DOWN): 123 Rounded with mc3 (precision=5, CEILING): 123.46 Rounded with mc4 (copy of mc2): 123 */
Program on Demonstrating MathContext Methods
import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; public class MathContextMethodsDemo { public static void main(String[] args) { // Create two MathContext objects MathContext mc1 = new MathContext(4, RoundingMode.HALF_UP); MathContext mc2 = new MathContext(4, RoundingMode.HALF_UP); MathContext mc3 = new MathContext(6, RoundingMode.DOWN); // Display precision and rounding mode System.out.println("MathContext mc1 Precision: " + mc1.getPrecision()); System.out.println("MathContext mc1 RoundingMode: " + mc1.getRoundingMode()); // Compare two MathContext objects System.out.println("mc1.equals(mc2)? " + mc1.equals(mc2)); // true System.out.println("mc1.equals(mc3)? " + mc1.equals(mc3)); // false // Display hash codes System.out.println("mc1 HashCode: " + mc1.hashCode()); System.out.println("mc2 HashCode: " + mc2.hashCode()); System.out.println("mc3 HashCode: " + mc3.hashCode()); // String representation System.out.println("mc1 toString(): " + mc1.toString()); System.out.println("mc3 toString(): " + mc3.toString()); // Using MathContext with BigDecimal BigDecimal value = new BigDecimal("12345.6789"); BigDecimal result1 = value.round(mc1); BigDecimal result2 = value.round(mc3); System.out.println("Original Value: " + value); System.out.println("Rounded with mc1 (precision=4, HALF_UP): " + result1); System.out.println("Rounded with mc3 (precision=6, DOWN): " + result2); } } /* MathContext mc1 Precision: 4 MathContext mc1 RoundingMode: HALF_UP mc1.equals(mc2)? true mc1.equals(mc3)? false mc1 HashCode: [some number] mc2 HashCode: [same as mc1] mc3 HashCode: [different number] mc1 toString(): precision=4 roundingMode=HALF_UP mc3 toString(): precision=6 roundingMode=DOWN Original Value: 12345.6789 Rounded with mc1 (precision=4, HALF_UP): 12350 Rounded with mc3 (precision=6, DOWN): 12345.6 */