[Java] float vs double vs BigDecimal

NCOOKIE·2025년 2월 24일

TIL

목록 보기
5/20
post-thumbnail

자바에서는 소수를 표현할 때 보통 double이나 float을 사용한다. 이 둘은 정밀도와 표현 범위(크기)가 다른 것으로 알고 있다. 그렇다면 평소 개발할 때 둘 중 어느 것을 사용해야 할지, 그 기준은 어떻게 할 것인지에 대해 알아보았다.

float vs double

floatdouble은 자바에서 부동 소수점 숫자를 저장하는데 사용되는 두 가지 기본 타입(primitive type)이다. 부동 소수점 숫자란 3.14159 or 1.23456789e1 같이 소수점을 가질 수 있는 숫자를 말한다.

이들은 실수형의 값을 부동 소수점(floating point)의 형태로 저장한다. 부동소수점은 부호(Sign), 지수(Exponent), 가수(Mantissa) 세 부분으로 이루어져 있다.

두 데이터 타입 모두 소수점을 포함한 숫자를 나타내지만, float은 32비트 크기인 반면 double은 64비트 크기다. doublefloat의 두 배 크기이므로 "double"이라고 부른다... 정밀도도 2배다.

소수의 기본 데이터 타입

자바가 프로그램에서 소수를 만나거나 계산이 부동소수점 숫자를 생성할 때, 해당 숫자를 double로 취급한다. 아래의 코드는 자바가 모든 소수를 double로 간주하기 때문에 컴파일에 실패한다. floatdouble의 전체 범위를 다룰 수 없기 때문이다.

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

  • 스마트폰, IoT 기기와 같이 메모리 용량이 넉넉하지 않을 때
  • 다루려는 데이터가 낮은 정밀도로 괜찮고 크기가 float으로 충분할 때

double

  • 일반적인 애플리케이션을 개발할 때
  • 메모리 효율에 대해 크게 신경쓰지 않아도 될 때
  • 재무 데이터, 과학적 계산 등 높은 정밀도가 요구되는 데이터를 다룰 때

결론

일반적인 애플리케이션을 개발할 때에는 크게 신경쓰지 않고 double을 쓰면 될 것 같다. 만약 프로그램이 높은 성능(AI 데이터 학습과 같이 매우 많은 데이터를 다루는 경우 등)을 요구한다거나, 실행되는 플랫폼의 하드웨어 스펙이 널널하지 않다면 float 사용을 고려해야 한다.

BigDecimal

컴퓨터에서 실수를 표현할 때에는 주로 IEEE 754 표준을 사용한다. 소수 자리수가 굉장히 크거나 무한 소수의 값은 근사값의 형태로 표현한다. 때문에 floatdouble은 실수를 정확하게 표현하는데 한계가 있다.

BigDecimal은 임의의 정밀도로 수치를 표현할 수 있어, float이나 double처럼 부동소수점 연산에서 발생할 수 있는 오차 없이 매우 정확한 계산이 가능하다. 이러한 특징 덕분에 금융, 회계 등 소수점 이하의 정확한 계산이 중요한 분야에서 BigDecimal은 필수다.

그러나 BigDecimal은 객체 기반으로 동작하는지라 기본 자료형에 비해 연산 속도가 느리다. 즉, 계산량이 많거나 실시간 처리가 중요한 애플리케이션에서는 성능 문제가 발생할 수 있다.

진짜 결론

메모리를 차지하는 공간만 따지자면 float < double < BigDecimal 순이다. 하지만 소 잡는 칼로 닭 잡는다는 속담이 있듯이, 실행 환경과 사용하려는 목적에 따라 적절하게 선택하면 될 것 같다.

참고

profile
일단 해보자

0개의 댓글