프로그래밍 PROGRAMMING/파이썬 PYTHON

[PYTHON] 파이썬 부동소수점 오차 해결

매운할라피뇽 2026. 1. 23. 09:29
반응형

파이썬 부동소수점 오차 해결

파이썬 부동소수점 오차 해결

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을 사용하는 습관을 들이시길 바랍니다.

반응형