
파이썬 부동소수점 오차 해결
1. 개요
프로그래밍을 처음 배울 때 가장 놀라운 경험 중 하나는 컴퓨터가 간단한 산수를 틀리는 순간입니다.
print(0.1 + 0.2)
# 기대값: 0.3
# 실제값: 0.30000000000000004
파이썬뿐만 아니라 대부분의 언어에서 발생하는 이 현상은 버그가 아닙니다. 컴퓨터가 실수를 표현하는 방식인 부동소수점(Floating Point)의 한계 때문입니다.
이 글에서는 이 오차가 발생하는 이유와, 정확한 계산이 필요할 때 사용하는 Decimal 모듈에 대해 알아봅니다.
2. 간단한 설명
컴퓨터는 0과 1, 즉 이진수로 모든 데이터를 저장합니다. 정수는 이진수로 정확히 변환되지만, 소수는 이야기가 다릅니다.
0.1 같은 숫자는 십진수로는 딱 떨어지지만, 이진수로 변환하면 0.0001100110011... 처럼 무한히 반복되는 순환소수가 됩니다. 메모리는 유한하므로 컴퓨터는 적당한 지점에서 이 숫자를 자르게 되고, 필연적으로 미세한 오차가 발생합니다.
이 미세한 오차가 쌓이거나 연산되는 과정에서 사람이 눈치챌 수 있는 오차로 드러나게 되는 것입니다.
3. 사용 사례
일반적인 과학 계산이나 게임 데이터에서는 이 정도 오차가 허용되지만, 돈과 관련된 계산에서는 치명적일 수 있습니다.
사례: 쇼핑몰 포인트 적립 계산
쇼핑몰에서 결제 금액의 10%, 20%를 포인트로 합산하는 로직을 짠다고 가정해 봅시다.
[Before] float 자료형 사용
total_point = 0.0
total_point += 0.1 # 100원의 10%
total_point += 0.2 # 200원의 10%
print(total_point)
# 결과: 0.30000000000000004
이렇게 데이터베이스에 저장되면, 나중에 포인트 정산 시 1원 단위가 맞지 않는 문제가 발생할 수 있습니다.
[After] decimal 모듈 사용
파이썬의 내장 모듈인 decimal을 사용하면 십진수 기반으로 정확한 연산을 수행할 수 있습니다.
from decimal import Decimal
# 문자열로 초기화해야 정확성이 유지됩니다
point_a = Decimal('0.1')
point_b = Decimal('0.2')
total_point = point_a + point_b
print(total_point)
# 결과: 0.3
Decimal 객체를 사용할 때는 반드시 숫자를 문자열(String) 형태로 넘겨줘야 초기화 단계에서의 부동소수점 오차까지 방지할 수 있다는 점을 기억하세요.
4. 맺음말
부동소수점 오차는 컴퓨터 구조상 피할 수 없는 숙명과도 같습니다. 중요한 것은 이 오차를 없애는 것이 아니라, 오차가 허용되는 상황과 그렇지 않은 상황을 구분하는 능력입니다.
정확한 수치 계산이 필요한 금융, 정산 시스템을 개발한다면 float 대신 반드시 Decimal을 사용하는 습관을 들이시길 바랍니다.
'프로그래밍 PROGRAMMING > 파이썬 PYTHON' 카테고리의 다른 글
| [PYTHON] 파이썬 음수 나눗셈의 비밀: // 연산자가 C언어와 다른 이유 (0) | 2026.01.26 |
|---|---|
| [PYTHON] 파이썬에서 복소수 나눗셈 결과가 이상할 때 : 복소수(Complex) 나눗셈의 이해와 활용 (0) | 2026.01.22 |
| [PYTHON] 파이썬 반올림, 올림, 내림 정복하기: round()의 함정과 math 모듈 (0) | 2026.01.21 |
| [PYTHON] 파이썬 무한 정수와 나눗셈: 큰 수 연산은 얼마나 느릴까? (0) | 2026.01.19 |
| [PYTHON] 파이썬 나머지 연산자(%) 활용 : 홀짝 판별부터 순환 알고리즘 (0) | 2026.01.18 |