Java의 Double 형 사칙연산 오차
어제 술자리에서 다른 개발자가 Double 형 사칙연산시 오차범위가 발생하는 내용에 대해 얘기했다..
헉.. 금시초문이다... ㅡㅡ;; 난 왜 처음 알았지...? ^^;;
아침에 출근하자 마자 눈으로 확인... 정말.... 그렇다....
System.out.println(11000 * 1.15);
==> 12649.999999999998 (12650.00 값이 나올줄 알았는데...)
그래서 검색을 해보니.... float과 double 형은 빠르게 근사치로 계산 하기위해 만들어졌다고 한다..
그럼 double 형을 계산 할때는 어떻게 해야하나... BigDecimal을 이용하는 방법이 있다고 한다.
헌데... 아래와 같이 테스트를 해보니....헉... 그래도 오차범위가 생긴다....
System.out.println(new BigDecimal(11000).multiply(new BigDecimal(1.15)));
==> 12649.999999999999023003738329862244427204132080078125000
위와 같은 결과가 나오는건.. BigDecimal을 생성할때 double 형을 매개변수로 전달해서 그렇다.
이때 double형이 전달되면 그자체로 double 형이 오차를 포함하고 있어서 그렇다고 한다.
이문제를 해결하려면 BigDecimal을 생성할때 매개변수로 String 값을 전달하는 거다.
System.out.println(new BigDecimal("11000").multiply(new BigDecimal("1.15")));
==> 12650.00 (이제 정상적인 값이 나왔다.)