도구스개발

부동소수점 비트 분해기

숫자가 IEEE 754 형식으로 어떻게 저장되는지 부호·지수·가수 비트로 분해해 보여줍니다. 0.1 + 0.2가 왜 0.3이 아닌지 확인하세요.

0.1 처럼 십진수로는 간단한 값이 이진수로는 딱 떨어지지 않습니다

실제로 저장되는 값 · 정규수

0.10000000000000000555

입력한 값과 다릅니다 — 이진수로 정확히 담기지 않기 때문입니다

비트 표현

0011111110111001100110011001100110011001100110011001100110011010
부호 1비트지수 11비트가수 52비트

분해

부호0 (양수)
지수2^-4(비트값 1019 − 바이어스 1023)
16진수0x3FB999999999999A
다음 표현 가능한 값까지1.3878e-17

직관과 어긋나는 계산

0.1 + 0.2기대한 값 0.30.30000000000000004
0.1 × 3기대한 값 0.30.30000000000000004
1.1 + 2.2기대한 값 3.33.3000000000000003
4.35 × 100기대한 값 435434.99999999999994

왜 0.1 + 0.2 가 0.3 이 아닌가

컴퓨터는 숫자를 2진 분수로 저장합니다. 10진수 0.1 은 2진수로 0.0001100110011… 처럼 무한히 반복돼서, 정해진 비트 수 안에 딱 맞게 담을 수 없습니다. 10진수로 1/3 을 0.3333… 으로밖에 못 쓰는 것과 같은 이유입니다.

그래서 저장되는 값은 0.1 에 가장 가까운 2진수이고, 두 개를 더하면 그 오차가 겉으로 드러납니다. 돈처럼 정확해야 하는 값은 정수(원 단위)로 다루거나 십진 소수 라이브러리를 쓰세요.

자바스크립트의 숫자는 전부 배정도(64비트)입니다. 단정도는 C·Java 의 float, GPU 셰이더, 일부 이진 파일 형식에서 쓰입니다. 같은 값이라도 정밀도를 바꾸면 저장되는 값이 달라집니다.

사용 방법

  1. 1분해할 숫자를 넣습니다. 0.1처럼 십진수로 간단한 값이 흥미롭습니다.
  2. 2단정도(32비트)와 배정도(64비트) 중에서 고릅니다.
  3. 3비트 표현에서 부호·지수·가수가 색으로 구분되어 나옵니다.
  4. 4실제로 저장되는 값이 입력한 값과 다른지 확인합니다.

자주 묻는 질문

0.1과 0.2를 이진수로 정확히 담을 수 없기 때문입니다. 십진수 0.1은 이진수로 0.0001100110011…처럼 무한히 반복되는데, 64비트 안에는 유한한 자리까지만 저장됩니다. 저장된 두 근사값을 더하면 그 오차가 겉으로 드러납니다. 10진수로 1/3을 0.3333…으로밖에 못 쓰는 것과 같은 이유입니다.

부동소수점은 과학적 표기법과 같은 구조입니다. 부호는 양수·음수를 나타내는 1비트, 지수는 소수점을 몇 칸 옮길지, 가수는 유효숫자에 해당합니다. 배정도는 부호 1비트, 지수 11비트, 가수 52비트로 나뉩니다. 지수는 음수도 표현해야 해서 바이어스(배정도 1023)를 더해 저장하며, 실제 지수는 저장된 값에서 이 바이어스를 뺀 값입니다.

가수 비트 수가 달라 표현할 수 있는 유효숫자가 다릅니다. 단정도(float, 32비트)는 십진수 약 7자리, 배정도(double, 64비트)는 약 16자리까지 믿을 수 있습니다. 자바스크립트의 숫자는 모두 배정도이며, 단정도는 C·Java의 float, GPU 셰이더, 일부 이진 파일 형식에서 씁니다.

정수로 다루세요. 원 단위 그대로 정수로 계산하거나, 센트처럼 최소 단위를 정해 정수로 저장한 뒤 표시할 때만 소수점을 찍습니다. 부동소수점으로 금액을 더하면 오차가 쌓여 합계가 1원씩 어긋날 수 있습니다. 정밀도가 중요하면 십진 소수를 다루는 라이브러리를 쓰는 방법도 있습니다.

있습니다. 2의 거듭제곱으로 나누어떨어지는 값은 정확합니다. 0.5, 0.25, 0.125는 물론이고 정수도 일정 범위까지는 정확합니다. 배정도는 2의 53제곱까지, 단정도는 2의 24제곱까지의 정수를 오차 없이 담습니다. 그래서 단정도에서는 16,777,217이 16,777,216으로 저장됩니다.

표현할 수 있는 가장 작은 정규수보다 더 작은 값을 담기 위한 형식입니다. 지수 비트가 전부 0일 때 쓰이며, 가수 앞의 암묵적인 1이 없어 정밀도를 희생하는 대신 0에 더 가까운 값을 표현합니다. 지수 비트가 전부 1이면 무한대(가수가 0)나 NaN(가수가 0이 아님)이 됩니다.

알아두면 좋은 점

  • 브라우저의 DataView로 실제 메모리 표현을 그대로 읽습니다. 근사 계산이 아닙니다.
  • 입력 자체가 자바스크립트 배정도를 거치므로, 배정도로 표현할 수 없는 값은 입력 시점에 이미 반올림됩니다.

함께 보면 좋은 도구

마지막 검증: 2026년 8월 29일 · 결과는 참고용 추정치입니다.