진법 소수 변환기 (0.1이 안 떨어지는 이유)
소수를 2·8·10·16진법으로 바꾸면서 유한으로 끝나는지 순환하는지 판정하고 순환 마디를 괄호로 보여 줍니다. 0.1이 2진법에서 왜 안 떨어지는지, double에 실제로 담기는 값이 무엇인지 확인할 수 있습니다.
소수점을 찍어 넣습니다. 음수도 됩니다.
2진법으로 쓰면
0.0(0011)
괄호 안 «0011»가 끝없이 되풀이됩니다. 마디 길이는 4자리입니다.
왜 떨어지거나 순환하는가 — 분모의 소인수를 보면 안다
| 밑 | 밑의 소인수 | 분모의 소인수 | 밑에 없는 것 | 결과 |
|---|---|---|---|---|
| 2 | 2 | 2 · 5 | 5 | 순환소수 |
| 8 | 2 | 2 · 5 | 5 | 순환소수 |
| 10 | 2 · 5 | 2 · 5 | — | 유한소수 |
| 16 | 2 | 2 · 5 | 5 | 순환소수 |
기약분수 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이 아닌 이유가 이것입니다.
사용 방법
- 1변환할 수를 소수점을 찍어 넣습니다. 0.1처럼 흔한 값부터 넣어 보세요.
- 2넣은 수가 어느 진법으로 쓰인 것인지 고릅니다. 기본은 10진법입니다.
- 32·8·10·16진법 결과에서 괄호가 있으면 그 안이 끝없이 되풀이되는 마디입니다.
- 4소인수 표에서 분모의 소인수 가운데 밑에 없는 것이 무엇인지 보고, 그것이 순환의 원인임을 확인합니다.
- 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일 · 결과는 참고용 추정치입니다.