자바에서는 소수를 표현할 때 보통 double이나 float을 사용한다. 이 둘은 정밀도와 표현 범위(크기)가 다른 것으로 알고 있다. 그렇다면 평소 개발할 때 둘 중 어느 것을 사용해야 할지, 그 기준은 어떻게 할 것인지에 대해 알아보았다.
float과 double은 자바에서 부동 소수점 숫자를 저장하는데 사용되는 두 가지 기본 타입(primitive type)이다. 부동 소수점 숫자란 3.14159 or 1.23456789e1 같이 소수점을 가질 수 있는 숫자를 말한다.

이들은 실수형의 값을 부동 소수점(floating point)의 형태로 저장한다. 부동소수점은 부호(Sign), 지수(Exponent), 가수(Mantissa) 세 부분으로 이루어져 있다.
두 데이터 타입 모두 소수점을 포함한 숫자를 나타내지만, float은 32비트 크기인 반면 double은 64비트 크기다. double은 float의 두 배 크기이므로 "double"이라고 부른다... 정밀도도 2배다.
자바가 프로그램에서 소수를 만나거나 계산이 부동소수점 숫자를 생성할 때, 해당 숫자를 double로 취급한다. 아래의 코드는 자바가 모든 소수를 double로 간주하기 때문에 컴파일에 실패한다. float은 double의 전체 범위를 다룰 수 없기 때문이다.
float myboat = 1.2;
float yourBoat = 10 * 2.5;
float theBoat = Math.PI * 10;
만약 위의 코드가 에러가 발생하지 않게 수정하고 싶다면 다음과 같이 하면 된다.
f 접미사 붙이기double로 바꾸기float myboat = 1.2f;
double yourBoat = 10 * 2.5;
float theBoat = (float) (Math.PI * 10);
float으로 충분할 때일반적인 애플리케이션을 개발할 때에는 크게 신경쓰지 않고 double을 쓰면 될 것 같다. 만약 프로그램이 높은 성능(AI 데이터 학습과 같이 매우 많은 데이터를 다루는 경우 등)을 요구한다거나, 실행되는 플랫폼의 하드웨어 스펙이 널널하지 않다면 float 사용을 고려해야 한다.
컴퓨터에서 실수를 표현할 때에는 주로 IEEE 754 표준을 사용한다. 소수 자리수가 굉장히 크거나 무한 소수의 값은 근사값의 형태로 표현한다. 때문에 float과 double은 실수를 정확하게 표현하는데 한계가 있다.
BigDecimal은 임의의 정밀도로 수치를 표현할 수 있어, float이나 double처럼 부동소수점 연산에서 발생할 수 있는 오차 없이 매우 정확한 계산이 가능하다. 이러한 특징 덕분에 금융, 회계 등 소수점 이하의 정확한 계산이 중요한 분야에서 BigDecimal은 필수다.
그러나 BigDecimal은 객체 기반으로 동작하는지라 기본 자료형에 비해 연산 속도가 느리다. 즉, 계산량이 많거나 실시간 처리가 중요한 애플리케이션에서는 성능 문제가 발생할 수 있다.
메모리를 차지하는 공간만 따지자면 float < double < BigDecimal 순이다. 하지만 소 잡는 칼로 닭 잡는다는 속담이 있듯이, 실행 환경과 사용하려는 목적에 따라 적절하게 선택하면 될 것 같다.