- 최초 작성일: 2001-08-28
- 최종 수정일: 2026-09-29
- 조회수: 30 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 0과 0은 정녕 같은가
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
0과 0은 정녕 같은 것일까요? 이건 또 먼 뚱딴지 같은 소린가 하시겠지요? ^^
질문 하나
인터넷을 보다가 우연히 Exceller님을 알게 되어서 많은 도움을 받고
있습니다. 하는 일이 주로 숫자를 보는 일이라 Excel을 많이 사용하는데
소수점 계산을 하다가 이런 일이 발생하는데 문제가 뭔지 잘 모르겠습니다.
한 셀(A1)에 51133391.931
다음셀(B1)에 51131523.351
을 입력후 위에서 아래를 빼면 1868.58(C1) 이 계산됩니다.
그런데, 이 값을 복사해서 다른 셀에 값만 복사해보면
1868.57999999821이라는 값이 입력되어 있습니다.
그래서 수식으로 계산된 1868.58에 대해서 수식'=if(c1>=1868.58,"맞다",
"틀리다")를 입력하면 "틀리다"가 출력됩니다.
참고로, 저는 오피스97을 사용하고 있습니다.
답변 부탁드리고요, 앞으로도 좋은 강좌 부탁드리겠습니다.
글구, 혹시 access강좌는 하실 생각 없으십니까?
0과 0은 정녕 같은가
핵심 요약
- 화면에 같은 숫자로 보여도 내부에 저장된 값은 부동 소수점 연산 오차 때문에 미세하게 다를 수 있습니다.
- 이 차이 때문에 소수점 계산 결과를 직접 비교하는 IF 수식에서 예상과 다른 결과가 나올 수 있습니다.
- 컴퓨터의 수치 연산에는 허용 오차라는 개념이 필요하며 표시값과 실제 저장값을 구분해서 이해해야 합니다.
Pentium CPU에는 Floating Point Unit(부동 소수점 장치) 이라고 하는 장치가 있는데 복잡한 산술 계산을 수행합니다. 1994년에 이 FPU와 관련된 유명한 사건이 한 가지 있었습니다.
당시 펜티엄 칩 설계를 출시하고 얼마 지난 무렵이었는데, 어느 한 교수에 의해 펜티엄 칩이 나눗셈 오류를 유발시킨다는 사실이 밝혀졌습니다. 이것은 칩 설계상의 사소한 오류로, 90억 번만에 한번씩 나눗셈에서 근사값 오류를 일으키는 것이었습니다. 90억 번에 한 번 이라는 것은 일반적인 엑셀(스프레드시트) 사용자가 27000년에 한번 마주칠까 말까하는 정도의 오류 수준이라고 합니다.
인텔 측에서도 이 사실을 알고 있었으나 보완책 보다는 Sales 측면에 더많은 관심을 기울였습니다. 그러던 차에 이 내용이 어느 한 경제지의 머리기사로 상세히 실렸고 그 다음 주에는 다른 경제지에도 게재가 되었습니다. 이 때까지만 해도 세인의 주목을 그다지 끌지 못했으나 CNN에서 취재를 하면서부터 이 문제는 일파만파로 번져나가기 시작했습니다. 우여곡절 끝에, 4억 75백만 달러라는 엄청난 결손이 발생하였는데 이것은 당시 인텔사의 반년 분 기술개발 예산 또는 5년 분의 펜티엄 프로세서 광고비와 맞먹는 것이었습니다.
위의 질문하신 분의 경우에도 이러한 문제는 OS나 Excel의 버전과 관련된 문제가 아니라 컴퓨터 자체의 한계성에서 기인하는, 컴퓨터의 고질적인 에러 중 하나입니다. 이러한 것을 Floating Point Error, 우리말로 하면 '부동 소수점 에러' 정도로 부를 수 있겠습니다. 이러한 문제를 해결하기 위해 프로그래머들은 '허용 오차(Tolerance)'라는 개념을 도입하게 됩니다. 더 이상 자세하게 설명하는 것은 의미가 없을 듯 하므로 이 쯤에서 접고... (사실은 능력도 안되고... ^^;)
쉽게 말하자면, 프로그램상에서 여러 단계의 계산을 통해 0이라는 결과값이 나왔다면 이론상으로는 0이 나와야 하지만 실제적으로는 0이 아닌 다른 값이 나올 수도 있다는 얘깁니다(얘기가 더 어려워졌나? ^^). 위에서 언급한 Tolerance(허용 오차)라는 것은 어떤 연산의 결과값이 0이 되어야 한다면 -10-12 ~ 10-12 사이의 값도 0으로 간주한다는 것입니다. 즉 -0.000000000123도 0이고 0.0000002345도 0이라는 의미입니다.
참고: 원문에서 지수 표기가 사라져 '-1012 ~ 1012'로 남아 있던 부분을, 문맥에 맞게 10의 -12제곱 표기로 바로잡았습니다. 아래 예시 숫자는 원문 그대로 두었습니다.
거대한 논리 덩어리인 컴퓨터에 있어, 이런 명확하지 않은 구석이 있다는 것이 어떻게 보면 믿기지 않고 불합리해 보입니다만, 이것은 컴퓨터의 구조 자체를 완전히 바꾸지 않는 한 해결하기가 힘들 지 않을까 생각합니다. 언젠가는 해결이 되겠지만 말이지요.
그리고 억세스 강좌에 대한 것은 시작하고 싶은 마음은 굴뚝 같습니다만 아직은 여건이 조성되지 않은 것 같습니다. 개인적으로나 사회적으로나 국가적으로나... ^^ 조금만 더 기다려 주시기 바랍니다.
다음 시간에...
정리 — 0과 0은 정녕 같은가
| 구분 | 내용 |
|---|---|
| 현상 | 51133391.931 에서 51131523.351 을 빼면 화면에는 1868.58 로 표시됨 |
| 실제 저장값 | 1868.57999999821 |
| 영향 | =IF(C1>=1868.58, ...) 비교가 예상과 다르게 틀리다로 판정됨 |
| 원인 | 부동 소수점 오차 (OS나 Excel 버전이 아니라 컴퓨터 자체의 한계) |
| 대처 개념 | 허용 오차(Tolerance) 안의 값은 같은 값으로 간주 |
자주 묻는 질문 (FAQ)
Q1. 화면에는 같은 값인데 왜 비교 결과가 다르게 나오나요?
화면에 표시되는 값과 내부에 저장된 값이 다를 수 있기 때문입니다. 소수점 계산에서는 부동 소수점 오차로 아주 미세한 차이가 생길 수 있습니다.
Q2. Excel 버전이나 운영체제 문제인가요?
아닙니다. 컴퓨터가 소수를 표현하는 방식 자체의 한계에서 생기는 오류이며 부동 소수점 에러라고 부릅니다.
Q3. 이런 오차를 어떻게 다루나요?
프로그래머들은 허용 오차라는 개념을 도입해 아주 작은 차이는 같은 값으로 간주합니다. 엑셀에서는 필요한 자릿수까지 ROUND 함수로 반올림한 뒤 비교하는 방법이 흔히 쓰입니다.
마치며
숫자를 비교할 때는 화면 표시값과 실제 저장값이 다를 수 있음을 항상 염두에 두세요. VBA에 대한 기초 지식을 공부하실 분은 아이엑셀러 닷컴 사이트 상단 메뉴에서 [Excel 강의] - [Excel 입문]을 먼저 보시면 이해하기 쉽습니다.