[Java] BigDecimal

in_ho_·2023년 10월 24일
0

Java

목록 보기
1/3
post-thumbnail

1. 부동 소수점

  • 컴퓨터는 2진수를 사용하기 때문에 소수를 표현할 때 근사치로 보여줍니다.
  • 이러한 근사치는 소수를 이용한 계산에서 오차를 발생시킬 수 있습니다.
  • Java에서 float, double을 사용할 때 의도치 않은 오차가 발생할 수 있습니다.

    결과로 0.799999999... 이러한 값을 받게된다.

  • 정확한 수치를 계산하기 위한 애플리케이션의 경우 BigDecimal을 사용한다.

2. BigDecimal

        /*
         * BigDecimal 사용
         */
        BigDecimal value1 = new BigDecimal("0.7");
        BigDecimal value2 = new BigDecimal("0.1");

        // 더하기
        BigDecimal addResult = value1.add(value2);

        System.out.println("더하기 : " + addResult);

        // 빼기
        BigDecimal subtractResult = value1.subtract(value2);

        System.out.println("빼기 : " + subtractResult);

        // 곱하기
        BigDecimal multiplyResult = value1.multiply(value2);

        System.out.println("곱하기 : " + multiplyResult);

        // 나누기
        BigDecimal divideResult = value1.divide(value2);
        
        System.out.println("나누기 : " + divideResult);

        // 나머지
        BigDecimal remainderResult = value1.remainder(value2);
        
        System.out.println("나머지 : " + remainderResult);
  • 하지만 여기서 주의할 것이 있습니다. BigDecimal을 이용하여 나눗셈을 할 때 나누어떨어지지 않는 수치로 계산할 경우 ArithmeticException이 발생합니다.
  • 그러므로 나눗셈을 할 때는 끝수 처리를 해야 합니다.

    java.math.RoundingMode에 정의되어 있습니다.

상수명설명
HALF_UP반올림
UP0에서 멀어지도록 올림 -.5.5의 경우 -6으로
DOWN0에서 가까워지도록 내림, -5.5의 경우 -5로
CEILING양의 무한대에 근접하도록, 양수인 경우 UP과 같고,
-5.5인 경우 소수점 이하 첫째자리에서 동작할 경우 -5가 됨
FLOOR음의 무한대에 근접하도록, 양수인 경우 DOWN과 같고,
-.5.5인 경우 소수점 이하 첫째자리에서 동작할 경우 -6이 된다.
        // 소수점 버리는 나머지
        BigDecimal value3 = new BigDecimal("7.0");
        BigDecimal value4 = new BigDecimal("3.0");
        
        divideResult = value3.divide(value4, RoundingMode.DOWN);

        System.out.println("소수점 버리는 나머지 : " + divideResult);

        divideResult = value3.divide(value4, 2, RoundingMode.HALF_UP);
  • BigDecimal의 divide 함수가 파라미터를 3개를 받게 될 경우 두 번째 파라미터는 몇 번째 자리에서 올림, 반올림, 내림을 동작할지 지정하는 int 값입니다.

3. StrictMath

  • Math 클래스는 실행 환경의 연산 처리를 이용해 연산 결과를 반환합니다.
  • StrictMath는 모든 플랫폼의 자바 환경에서 동일한 결과를 반환합니다.
  • 그렇기 때문에 환경에 따라 두 클래스 간에 결과 값이 상이할 수 있습니다.
  • 실행 속도는 Math 클래스가 실행 환경의 연산 처리를 사용하므로 조금 더 빠릅니다.

0개의 댓글