AI VIDEO BRIEFING

부동소수점 오류와 돈: 컴퓨터가 0.1+0.2를 0.3으로 못 만드는 이유

2000년대 초 금융 시스템을 흔든 미세한 반올림 오차의 정체를 짚고, 컴퓨터가 이진법으로 수를 저장하기 때문에 0.1+0.2가 0.3이 되지 않는 원리와 화폐를 정수(센트)로 다루는 해법을 설명한다.

컴퓨터는 왜 돈을 못 세는가 — 0.1 더하기 0.2가 0.3이 아닌 이유 영상 대표 이미지

핵심 메시지

  • 2000년대 초 온라인 결제와 은행 디지털화가 빠르게 진행되며 돈을 다루는 소프트웨어에서 미세한 반올림 오차가 생겨났다.
  • 센트의 극히 일부에 불과한 오차도 수백만 건의 거래에서 누적되면 잔액이 '표류'하고, 특정 거래 순서를 반복해 이를 악용하면 무에서 실제 돈을 만들 수 있었다.
  • 0.1 + 0.2가 0.3이 아니라 0.30000…04가 되는 이유는 컴퓨터가 10진법이 아니라 2진법으로 수를 저장하기 때문이다.
  • 0.1·0.2 같은 일부 소수는 이진법으로 정확히 표현되지 않아 가장 가까운 근삿값으로 저장되고, 그 합도 미세하게 어긋난다.
  • 그래서 현대 금융 시스템은 화폐에 부동소수점을 쓰지 않고 정수를 쓴다. 10.23달러를 1,023센트로 저장하면 반올림 오차도 표류도 없다.

쉽게 이해하기

영상은 사람들이 통장에서 '존재하지 않는 돈'을 발견했던 기술사의 한 장면으로 시작한다. 사기도 해킹도 아닌, 그저 오래된 종류의 버그였고 그것은 하나가 아니라 거대 금융기관들이 함께 겪은 '버그의 한 부류'였다.

배경은 2000년대 초다. 온라인 결제가 막 떠오르고 페이팔 같은 회사가 급성장하며 은행들도 뒤처지지 않으려 디지털화를 서둘렀다. 빠르게 움직이면 자연히 절충이 생기는데, 돈을 코드로 다루는 일은 생각보다 훨씬 어렵다. 돈에는 규칙이 있어 1센트도 잃거나 만들어선 안 되고 '거의 맞음'도 허용되지 않기 때문이다.

문제는 센트가 아니라 센트의 극히 일부에 해당하는 미세한 반올림 오차에서 시작됐다. 처음엔 아무도 눈치채지 못하지만, 하루 수백만 건의 거래마다 작은 오차가 쌓이면 이야기가 달라진다. 어떤 시스템은 올림, 어떤 시스템은 내림, 어떤 경우엔 아예 반올림을 하지 않아 돈이 '표류'했고 여러 플랫폼에서 잔액이 딱 맞지 않는다는 보고가 들어왔다.

곧 사람들은 거래를 쪼개고 합치고 변환했다가 되돌리는 특정 순서를 반복하면 이 오차를 자기에게 유리하게 증폭할 수 있다는 것을 발견했다. 시스템에 침입하는 해킹이라기보다 이미 존재하는 허점을 반복적으로 이용하는 방식이었다. 모두를 백만장자로 만들 정도는 아니었지만 무에서 실제 돈을 만들어낸 사례가 있었고, 수백만 사용자 규모로 번지자 비자·마스터카드를 비롯한 기관들은 '컴퓨터는 숫자에 강하다'는 가정을 버리고 숫자 처리 방식을 근본부터 다시 생각해야 했다.

원인은 간단한 시연으로 드러난다. 잔액 0에 0.1을 더하고 0.2를 더하면 0.3이 나와야 하지만 실제로는 0.30000…04 같은 값이 나오고, 잔액이 정확히 0.3인지 비교하는 조건은 실패한다. 컴퓨터가 우리처럼 10진법이 아니라 2진법으로 수를 저장하기 때문이다. 10진법은 0~9의 자리값이 10의 거듭제곱이고, 2진법은 0과 1의 자리값이 2의 거듭제곱이다.

0.1이나 0.2 같은 일부 소수는 2진법으로 정확히 표현할 수 없어 컴퓨터는 가장 가까운 근삿값을 저장한다. 그 근삿값들을 더하면 정확히 0.3이 아니라 살짝 어긋난 값이 된다. 대부분의 상황에선 문제없지만, 초당 수백만 번의 연산이 일어나는 금융 시스템에서는 그 미세한 차이가 실제 돈이 된다.

그래서 현대 시스템은 화폐에 부동소수점 대신 정수를 쓴다. 10.23달러를 그대로 저장하는 대신 1,023센트로 저장하면 소수점도, 반올림 오차도, 표류도 없다. 결국 그 하나의 버그 때문에 업계 전체가 코드에서 돈을 다루는 방식을 다시 설계했고, 우리가 온라인에서 가격을 보거나 결제할 때마다 0.1+0.2가 정말 0.3이 되도록 보장하는 엔지니어링 계층이 보이지 않게 작동하고 있다.

주요 인사이트

  • 개별적으로는 무의미한 반올림 오차도 대규모 거래에서 누적되면 실제 금전 문제로 비화한다 — 규모가 곧 위험이다.
  • 시스템마다 올림·내림·무반올림이 제각각이면 데이터가 '표류'하며, 이 불일치를 반복적으로 이용하는 악용이 가능해진다.
  • 0.1+0.2≠0.3은 언어의 결함이 아니라, 일부 10진 소수가 2진법으로 정확히 표현되지 않는 부동소수점의 본질적 특성이다.
  • 화폐를 다룰 때는 부동소수점을 피하고 최소 단위(센트)를 정수로 저장하는 것이 표준 해법이다.
  • '컴퓨터는 숫자에 강하다'는 직관은 금융 영역에서 위험할 수 있으며, 수 표현 방식에 대한 이해가 필수다.

자주 묻는 질문

왜 0.1 + 0.2가 0.3이 아닌가?

컴퓨터는 10진법이 아니라 2진법으로 수를 저장하는데, 0.1이나 0.2 같은 일부 소수는 2진법으로 정확히 표현할 수 없어 가장 가까운 근삿값으로 저장된다. 그 근삿값들을 더하면 0.3에서 살짝 어긋난 값이 나온다.

미세한 반올림 오차가 어떻게 실제 금융 문제가 됐나?

센트의 극히 일부에 불과한 오차도 하루 수백만 건의 거래에서 누적되면 잔액이 표류한다. 게다가 거래를 쪼개고 합치고 되돌리는 순서를 반복해 오차를 증폭하면 무에서 실제 돈을 만들어낼 수 있었다.

현대 금융 시스템은 이 문제를 어떻게 해결하나?

화폐에 부동소수점 대신 정수를 사용한다. 예를 들어 10.23달러를 1,023센트로 저장하면 소수점과 반올림 오차, 표류가 모두 사라진다.

원문과 출처

이 글은 원본 영상의 자막을 바탕으로 한국어 독자를 위해 요약했습니다. 전체 맥락과 최신 정보는 원문에서 확인하세요.

YouTube 원본 영상 보기 ↗

관련 AI 소식

#부동소수점#프로그래밍#금융시스템#컴퓨터과학#소프트웨어버그