알아가기/Java

[Java] MathContext 정확도를 조절하는 자바 클래스

XEV 2024. 1. 27. 12:19

 

 

MathContext는 자바의 java.math 패키지에 포함된 클래스로, BigDecimal 연산의 수학적 설정(정밀도와 반올림 모드)을 지정하는 데 사용된다.

정밀도(Precision)는 결과가 표현할 수 있는 최대 자릿수를 의미한다. 예를 들어, 정밀도가 5인 경우, 결과는 최대 5자리 숫자를 가질 수 있다.

반올림 모드(Rounding Mode)는 정밀도를 초과하는 숫자를 어떻게 처리할지 결정하는 규칙이다. 예를 들어, 반올림 모드가 HALF_UP인 경우, 소수점 이하의 숫자가 5 이상이면 올림하고, 그렇지 않으면 버림한다.

MathContext는 이런 설정들을 모아둔 것으로, BigDecimal 연산 시에 이를 인자로 전달하여 연산 방식을 제어할 수 있다.

 

 

 

정밀도 사용

import java.math.MathContext;
import java.math.BigDecimal;
 
 
public class MathContextExample1 {
    public static void main(String[] args) {
        // MathContext 객체 생성 (정밀도: 7)
        MathContext mc = new MathContext(7);
        
        // BigDecimal 객체 생성 (값: 111.1111111)
        BigDecimal number1 = new BigDecimal("111.1111111", mc);
        System.out.println("number1: " + number1);
        
        // BigDecimal 객체 생성 (값: 11111.11111)
        BigDecimal number2 = new BigDecimal("11111.11111", mc);
        System.out.println("number2: " + number2);
        
        // 덧셈 연산 수행
        BigDecimal result = number1.add(number2, mc);
        System.out.println("덧셈 결과: " + result);
    }
}



/*

number1: 111.1111
number2: 11111.11
덧셈 결과: 11222.22

*/

MathContext( {정밀도} )

위의 예제1 코드는 정밀도를 7로 제한하여 계산을 위해 설정된 값과 결과 값이 7자리만 지정되었다.

 

 

 

정밀도, 반올림 모드 사용

import java.math.MathContext;
import java.math.BigDecimal;
import java.math.RoundingMode;


public class MathContextExample2 {
    public static void main(String[] args) {
        // MathContext 객체 생성 (정밀도: 7, 반올림 모드: HALF_UP)
        MathContext mc = new MathContext(4, RoundingMode.HALF_UP);
        
        // BigDecimal 객체 생성 (값: 2.34567)
        BigDecimal number1 = new BigDecimal("2.34567");
        System.out.println("number1: " + number1);
        
        // BigDecimal 객체 생성 (값: 1.23456)
        BigDecimal number2 = new BigDecimal("1.23456");
        System.out.println("number2: " + number2);
        
        // 곱셈 연산 수행
        BigDecimal resultA = number1.multiply(number2);
        System.out.println("곱셈A 결과: " + resultA);

        BigDecimal resultB = number1.multiply(number2, mc);
        System.out.println("곱셈B 결과: " + resultB);
    }
}



/*

number1: 2.34567
number2: 1.23456
곱셈A 결과: 2.8958703552
곱셈B 결과: 2.896

*/

MathContext( {정밀도}. {반올림 모드} )

위의 예제2 코드는 정밀도를 4로 제한하고 반올림 모드 HALF_UP을 사용하여 5번째 수에서 반올림 된 4자리의 수만 출력되었다.

 

 

 

이처럼 MathContext는 BigDecimal 연산의 정밀도와 반올림 방식을 손쉽게 제어할 수 있는 방법을 제공한다. 이를 통해 복잡한 수치 연산을 보다 편리하게 수행할 수 있다.