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)이라고 한다.
차이가 선언한 오차 범위보다 작다면 같은 값으로 판단하는 방법이다. (오차 자체를 없애는 방식은 아님!)
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
}
}
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
}
}