자바가 실수를 저장하는 방법

허세진·2026년 1월 19일

backend

목록 보기
5/20

실수

실수는 소수점을 포함한 값을 표현하기 위한 데이터 타입이다.

실수형 데이터 타입은 소수점을 포함한 값을 표현할 수 있지만, 오차가 발생할 수 있다.

그래서 실수형 데이터 타입은 정밀도가 중요하다.

위 이미지에서 유효자릿수가 정밀도를 결정한다.
정밀도는 몇자리까지 오차없이 표현할 수 있는가를 의미한다.


위의 이미지에서는 실수형 데이터 타입이 표현할 수 없는 범위가 있다는 것을 확인할 수 있다. 실수형은 얼마나 큰 수를 표현하는가, 얼마나 0에 가깝게 표현하는가가 중요하다.(얼마나 정밀도있게 표현할 수 있는가라고도 할 수 있다.)

실수형 데이터 타입은 정밀도와 표현 범위에 한계가 있기 때문에, 컴퓨터는 실수를 일정한 규칙에 따라 나누어 저장해야 한다.

자바가 실수를 저장하는 방법


자바는 실수를 위와 같이 부호(S),지수(E), 가수(M)로 구성된 부동소수점 방식으로 값을 저장한다.

각 필드의 역할

  • 부호(S)는 값이 양수인지 음수인지를 나타낸다.
  • 지수(E)는 소수점의 위치를 결정한다.
  • 가수(M)는 실제 숫자의 유효 자릿수를 표현한다.

부동소수점이 값을 표현하는 방식

값 = (-1)^S × M × 2^E
자바는 실수를 하나의 값으로 저장하지 않고 숫자 값과 소수점 위치를 분리하여 저장한다.

오차 발생

0.1을 이진수로 변환하면 무한소수가 되는데, 제한된 비트로는 이를 정확히 표현할 수 없어 반올림이 발생한다.

위와 같은 이유로 부동소수점은 실제 값과 가장 가까운 근사값을 저장한다.

ex)

System.out.println(0.1 + 0.2);

결과: 0.30000000000000004

float / double

float과 double은 모두 부동소수점 방식이지만, 가수(M)와 지수(E)의 비트 수가 다르다.

double은 float보다 더 많은 비트를 사용하기 때문에 더 높은 정밀도를 제공한다.

-> 정밀도가 중요한 경우에는 double을 사용

BigDecimal

BigDecimal은 내부적으로 수를 십진수로 저장해서 아주 작은 수과 큰 수의 연산에 대해 거의 무한한 정밀도를 보장한다.

지금은 BigDecimal에 대해 그냥 이런게 있고 돈과 소수점을 다룰 때 이걸 쓴다 정도로만 알고 있고 나중에 따로 정리하려고 한다.

profile
로그를 파고드는 시간을 즐기는 백엔드 개발자, 허세진입니다.

0개의 댓글