03. 세 번째 수업: 반올림과 버림, 컴퓨터의 선택 (Rounding Rules)
오차를 피할 수 없다면, 숫자를 깔끔하게 다듬어서 통제하기 쉬운 형태로 깎아내는 ‘조각술(Rounding)’이 필요합니다. 지저분한 소수점을 처리하는 인간과 컴퓨터의 가장 대중적인 규칙 3가지를 정리해 봅시다.
1. 인간이 사랑하는 규칙: 반올림 (Rounding)
가장 흔한 방식입니다. 우리가 마주친 자리의 숫자가 $5$를 넘기면 윗자리를 하나 올려주고, $5$보다 작으면 가차 없이 버립니다. 숫자를 최대한 참값에 가깝게 유지하려는 공평한 심리에서 나왔습니다.
- $3.14$ (소수점 첫째 자리 $4$에서 반올림) $\rightarrow$ 소수점 이하자리 폭파 $\rightarrow$ $3$ (참값 $3.14$ 보다 $0.14$ 작아짐)
- $3.89$ (소수점 첫째 자리 $8$에서 반올림) $\rightarrow$ 파워업! $\rightarrow$ $4$ ($4$ 로 올라가며 참값 $3.89$ 에 $+0.11$ 오차로 바짝 다가감)
반올림의 위대함은, 무조건 내리치거나 무조건 올리는 것보다 전체적으로 오차의 총량을 최소한으로 줄여준다는 데 있습니다.
2. 컴퓨터 은행이 사랑하는 규칙: 내림/버림 (Truncating / Floor)
은행 이자 시스템이나 무자비한 컴퓨터 연산에서는 애매하면 그냥 가차 없이 뒤를 다 잘라버리는 ‘버림(Floor)’을 씁니다. 소수점 이하의 자질구레한 녀석들을 몽둥이로 때려서 아랫바닥(Floor)으로 끌어내리는 것입니다.
- $3.99$ 를 버림 $\rightarrow$ $3$
- 이 방식은 무조건 원래 참값보다 작은 숫자를 만들어냅니다. (오차가 무조건 마이너스 방향!)
3. 물건을 살 때: 올림 (Ceiling)
건축 현장에서 벽돌이 3.2개가 필요하다고 수학 계산이 나왔습니다. 벽돌 가게에 가서 “아저씨, 벽돌 반올림해서 3개만 주세요!” 라고 하면 남은 0.2개의 구멍 때문에 집이 무너집니다. 이럴 때는 뒤에 1이라도 찌꺼기가 붙어있으면 무조건 위 천장(Ceiling)으로 끌어올리는 ‘올림’을 씁니다.
- $3.2$ 를 올림 $\rightarrow$ $4$
4. 파이썬의 조각술 함수들 3총사
파이썬 내부 수학 톱니바퀴 math 모듈에는 이 세 가지를 완벽하게 집행하는 암살자 함수들이 들어있습니다.
# [Python] 숫자를 도륙하는 3가지 조각술 (반올림, 올림, 버림)
import math
messy_number = 4.6
print(f"타겟 무리수 모양의 폭탄: {messy_number}\n")
# 1. 반올림 (파이썬 내장함수 round)
# 주의! 파이썬의 round 는 끝자리가 딱 5일때 짝수쪽으로 붙어버리는 기묘한 'Banker's Rounding' 룰을 따릅니다.
rounded_num = round(messy_number)
print(f"1. 반올림(Round): {rounded_num} (4.6 이므로 5 에 더 가까움!)")
# 2. 내림/버림 (math.floor - 바닥으로 끌어내리기)
floor_num = math.floor(messy_number)
print(f"2. 버림(Floor) : {floor_num} (0.6 이 아깝지만 다 잘라버림!)")
# 3. 올림 (math.ceil - 천장으로 끌어올리기)
ceil_num = math.ceil(messy_number)
print(f"3. 올림(Ceiling): {ceil_num} (0.6 이 붙었다고 1 을 더해버림!)")
[실행 결과]
타겟 무리수 모양의 폭탄: 4.6
1. 반올림(Round): 5 (4.6 이므로 5 에 더 가까움!)
2. 버림(Floor) : 4 (0.6 이 아깝지만 다 잘라버림!)
3. 올림(Ceiling): 5 (0.6 이 붙었다고 1 을 더해버림!)
프로그래머가 소수점을 다룰 때, 자신이 어떤 상황(디자인, 건물 벽돌, 은행 이자율)에 직면했는지 정확하게 파악하고 이 3가지 칼(조각술) 중 하나를 신중하게 선택해야 대형 버그를 막을 수 있습니다!