[Java] 부동소수형 오차/BigDemical

사그미·2025년 5월 6일

Java

목록 보기
2/3
post-thumbnail
public class Test {
    public static void main(String[] args){
        double a = 0.1 + 0.1 + 0.1;
        double b = 0.3;
        System.out.println(a); // 0.30000000000000004
        System.out.println(b); // 0.3
        System.out.println(a==b); // false
    }
}

위처럼 부동소수형을 다룰 시 오차가 발생하는 이유는 자바는 부동소수형 데이터를 이진법으로 표현하기 때문이다. 이러한 표현 과정에서의 오차를 엡실론(epsilon)이라고 한다.

방법1. 직접 오차 범위 설정 - epsilon

차이가 선언한 오차 범위보다 작다면 같은 값으로 판단하는 방법이다. (오차 자체를 없애는 방식은 아님!)

public class Test {
    public static void main(String[] args){
        double epsilon = 1E-5;
        double a = 0.1 + 0.1 + 0.1;
        double b = 0.3;
        System.out.println(Math.abs(a-b)<epsilon); //true
    }
}

방법2. BigDemical

BigDemical은 double보다 연산 범위가 2배 이상 길어 더 정밀한 연산이 가능하다. BigDemical 사용시에는 String으로 변환해주어야 한다!(new BigDemical(0.1) xx)

public class Test {
    public static void main(String[] args){
        BigDecimal a = new BigDecimal("0.1").add(new BigDecimal("0.1")).add(new BigDecimal("0.1"));
        BigDecimal b = new BigDecimal("0.3");
        System.out.println(a); //0.3
        System.out.println(a.equals(b)); // true
    }
}
profile
애면글면

0개의 댓글