Java에서 float과 double 타입은 애초에 과학, 공학 계산을 위해 설계되었으며, 넓은 범위의 수에 대한 근사치를 빨리 산출하기 위한 이진 부동소수점 연산을 수행한다.IEEE 754 표준에 의해 정수, 소수 등과 같은 숫자가 2진으로 저장되기 때문에 결과값이 부정확해진다.✏️
float의 정밀도는 약 7자리 십진수,double의 정밀도는 약 15-16자리 십진수이다.✏️
💸 소수점에 대한 정확한 계산이 요구되거나 화폐 단위를 다룰 때는
BigDecimal을 사용해야 한다. 💸
new BigDecimal()BigDecinmal value = new BigDecimal("123.45"); // 123.4
BigDecinmal value2 = new BigDecimal(123.45); // 123.44999999999999
double타입처럼 실수형을 인자로 전달하는 생성자는 근사치 값이 그대로 전달되어 정확한 값이 저장되지 않을 수 있기 때문에 사용하지 않는 것String으로 할당해야 정확한 값을 얻을 수 있다.valueOf() 메서드BigDecinmal value = BigDecimal.valueOf(123.45);
double 또는 float 타입 변수를 BigDecimal로 변환하는 방법Double.toString() 을 통해 수를 문자열로 변환하여 BigDecimal 객체를 생성한다.출처
[Java] BigDecimal에 관한 고찰 🕵️♀️
Java - BigDecimal 사용하는 이유 (feat.부동소수점의 부정확성)
new BigDecimal과 BigDecimal.valueOf의 차이.