도구스개발

진법 소수 변환기 (0.1이 안 떨어지는 이유)

소수를 2·8·10·16진법으로 바꾸면서 유한으로 끝나는지 순환하는지 판정하고 순환 마디를 괄호로 보여 줍니다. 0.1이 2진법에서 왜 안 떨어지는지, double에 실제로 담기는 값이 무엇인지 확인할 수 있습니다.

소수점을 찍어 넣습니다. 음수도 됩니다.

2진법으로 쓰면

0.0(0011)

괄호 안 «0011»가 끝없이 되풀이됩니다. 마디 길이는 4자리입니다.

기약분수로 보면1 / 10
2진법0.0(0011) (순환)
8진법0.0(6314) (순환)
10진법0.1 (유한)
16진법0.1(9) (순환)

왜 떨어지거나 순환하는가 — 분모의 소인수를 보면 안다

밑의 소인수분모의 소인수밑에 없는 것결과
222 · 55순환소수
822 · 55순환소수
102 · 52 · 5유한소수
1622 · 55순환소수

기약분수 p/q를 밑 b로 적을 때, q의 소인수가 모두 b의 소인수 안에 있어야 유한소수가 됩니다. 2진법의 밑은 2뿐이라 분모에 5가 하나라도 있으면 반드시 순환합니다 — 0.1 = 1/10 = 1/(2·5)가 바로 그 경우입니다.

2진법으로 펼쳐 보기

0.0001100110011001100110011001100110011001

소수점 아래 40자리까지 자른 것입니다. 반올림하지 않고 잘랐습니다.

이 수를 double(배정밀도)에 담으면 실제로는

0.1000000000000000055511151231257827021181583404541015625

넣은 값과 다릅니다. 2진법에서 순환하는 수는 어디선가 잘라야 하고, double은 가장 가까운 «2의 거듭제곱 분모» 값을 대신 담습니다. 0.1 + 0.2가 0.3이 아닌 이유가 이것입니다.

화면에 0.1로 보이는 것은 자바스크립트가 «다시 읽었을 때 같은 값이 되는 가장 짧은 표기»를 골라 보여 주기 때문입니다. 저장된 수 자체가 그 값인 것이 아닙니다. 돈처럼 어긋나면 안 되는 값은 실수 대신 정수(원 단위)나 십진 자료형으로 다뤄야 합니다.

사용 방법

  1. 1변환할 수를 소수점을 찍어 넣습니다. 0.1처럼 흔한 값부터 넣어 보세요.
  2. 2넣은 수가 어느 진법으로 쓰인 것인지 고릅니다. 기본은 10진법입니다.
  3. 32·8·10·16진법 결과에서 괄호가 있으면 그 안이 끝없이 되풀이되는 마디입니다.
  4. 4소인수 표에서 분모의 소인수 가운데 밑에 없는 것이 무엇인지 보고, 그것이 순환의 원인임을 확인합니다.
  5. 5맨 아래에서 그 수를 double에 담았을 때 실제로 저장되는 값을 확인합니다.

자주 묻는 질문

0.0001100110011…로 0011이 끝없이 되풀이되는 순환소수가 됩니다. 0.1을 기약분수로 쓰면 1/10인데 분모 10의 소인수가 2와 5이고, 2진법의 밑에는 5가 없기 때문입니다. 유한 자리로는 절대 적을 수 없으므로 컴퓨터는 어딘가에서 잘라 저장할 수밖에 없습니다.

세 값 모두 2진법에서 순환해 정확히 저장되지 않기 때문입니다. double에 담긴 0.1은 실제로 0.1000000000000000055511151231257827021181583404541015625이고 0.2도 비슷하게 어긋나 있어, 둘을 더하면 0.3에 가장 가까운 double이 아니라 그보다 조금 큰 값이 나옵니다. 컴퓨터가 계산을 대충 해서가 아니라 애초에 그 수를 담을 수 없어서 생기는 일입니다.

기약분수 p/q에서 분모 q의 소인수가 모두 밑의 소인수 안에 있으면 유한소수가 됩니다. 10진법의 밑은 2와 5라서 분모가 2와 5로만 이뤄지면 떨어지고(1/4 = 0.25, 1/20 = 0.05), 2진법의 밑은 2뿐이라 분모가 2의 거듭제곱일 때만 떨어집니다. 그래서 0.5, 0.25, 0.75는 2진법에서도 딱 끝납니다.

긴 나눗셈을 하면서 나머지가 다시 나오는 자리를 잡습니다. 나머지는 분모보다 작은 수뿐이라 종류가 유한하므로, 늦어도 분모 번째 자리 안에 반드시 되풀이됩니다. 이 계산기는 그 자리를 표시해 괄호로 묶어 보여 줍니다.

쓰지 않는 편이 안전합니다. 0.1원이 정확히 저장되지 않아 더할수록 오차가 쌓이고, 반올림 결과가 기대와 어긋날 수 있습니다. 원 단위 정수로 다루거나 언어가 제공하는 십진 자료형(자바 BigDecimal, 파이썬 decimal 등)을 쓰는 것이 보통입니다.

전송되지 않습니다. 모든 계산은 브라우저 안에서 이뤄지고, 입력값은 이 기기에만 남습니다.

알아두면 좋은 점

  • 검증은 0.1 = 0.0(0011)₂, 0.2 = 0.(0011)₂, 0.3 = 0.0(1001)₂, 1/7 = 0.(142857)₁₀, 0.75 = 0.11₂ 같은 손으로 확인할 수 있는 값과, double에 담긴 0.1의 정확한 십진값으로 했습니다. 분모 1~60과 여러 밑에 대해 소인수 판정과 실제 전개 결과가 언제나 일치하는지도 대조했습니다.
  • 계산은 BigInt로 하는 정확한 분수 연산입니다. 실수로 계산하면 판정하려는 오차 자체에 휘말리므로 소수점을 실수로 다루지 않습니다.
  • double에 담기는 값은 비트에서 곧장 꺼내 정확히 적습니다. 분모가 2의 거듭제곱이라 10진법에서는 반드시 유한하고, 따라서 «대략»이 아니라 끝자리까지 정확한 값입니다.
  • 소수점 아래는 512자리까지만 계산합니다. 분모가 아주 크면 순환 마디가 그보다 길 수 있고, 그때는 잘렸다는 표시(…)가 붙습니다.
  • 정수 부분만 다루는 진법 변환은 별도의 진법 변환 도구가, IEEE 754의 부호·지수·가수 비트 배치는 부동소수점 비트 분해기가 맡습니다. 이 도구는 소수부가 유한한지 순환하는지에 초점을 둡니다.

함께 보면 좋은 도구

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