☕ Java
Double과 Float를 사용하면 안되는 이유
Java에서 소수를 표현할 때 보통
double
이나 float
형식의 자료형을 사용합니다.java 관련 강의를 듣는데 강사님께서 이런말씀을 하시더군요.
double과 float 대신 BigDecimal 자료형을 사용하세요
왜 이런 말씀을 하시고 왜
double
과 float
대신 BigDecimal
을 사용해야 하는지 알아봅시다.부동소수점 연산의 정확도 문제
float
나 double
은 부동소수점으로 값을 표현하다보면, 소수점 이하의 값이 정확하게 표현이 안되는 오류가 발생합니다.double a = 1.03; double b = 0.42; System.out.println(a - b); // 결과: 0.6100000000000001
위에서 보여지는 코드와 같이 연산이 실행되면, 연산의 기댓값인 0.61이 출력되는게 아닌 이상한 값이 출력됨을 확인 할 수 있습니다.
그 이유는 부동소수점 표현으로 인한 한계 때문인데, 소수 자리수가 굉장히 큰 경우 혹은 무한 소수의 값을 저장하는 경우 적절한 표기를 위해 표준에 맞춰서 근사값의 형태로 값을 표현하기 때문입니다.
이러한 문제를 해결하기 위해서
BigDecimal
을 사용합니다.BigDecimal
BigDecimal a = new BigDecimal("1.03"); BigDecimal b = new BigDecimal("0.42"); System.out.println(a.subtract(b)); // 결과: 0.61
이렇게
BigDecimal
을 이용하면, 정확한 결괏값을 얻을 수 있습니다.이것이 가능한 이유는,
BigDecimal
자료형의 범위는 double
보다 더 넓고, 또 근삿값을 이용한 표현방식이 아닌, 유효숫자와 소수점을 기준으로 표현하기 때문입니다.그래서 돈을 계산하거나 금융 프로젝트 등에서 소수를 사용할 때는 꼭
BigDecimal
을 사용해야 합니다.어디가. Double, Float 버려?
그렇담 우리가 지금까지 잘 사용해온
double
, float
는 정말 사용하지 않을까요?BigDecimal
은 불변 객체 (immutable) 입니다. 값을 새로 선언할 때 마다, 메모리에 저장됩니다.그래서 메모리를 많이 소모하게 되고, 또 그러한 이유 때문에 연산 속도도
double
, float
에 비해 느립니다.따라서 소수를 더 많이 다루거나 정확한 값을 요할 때에는
BigDecimal
을메모리를 절약하고 빠른 연산을 위해서는
double
/ float
를 상황에 맞게 사용할 줄 알아야겠습니다.