SJ_Koding

Python의 built-in round 함수에 대해 (.5값 처리 방식) 본문

Algorithm

Python의 built-in round 함수에 대해 (.5값 처리 방식)

성지코딩 2024. 1. 21. 22:27

이번 글 요약: 파이썬의 built-in round()는 .5에 대해 올림을할까요 내림을할까요?

파이썬에서 반올림을 지원하는 내장 함수 round() 가 있다.

  1. 음수를 반올림하고, 반올림 자리가 음수인 경우 (예: 십의 자리나 백의 자리에서 반올림):
    • round(-419.219, -1) = -420.0
    • round(-866.057, -1) = -870.0
    • round(-231.095, -2) = -200.0
  2. 음수를 반올림하고, 반올림 자리가 양수인 경우 (예: 소수점 첫째 자리나 둘째 자리에서 반올림):
    • round(-44.754, 1) = -44.8
    • round(-195.738, 2) = -195.74
    • round(-392.451, 2) = -392.45
  3. 양수를 반올림하고, 반올림 자리가 음수인 경우:
    • round(334.167, -1) = 330.0
    • round(540.956, -2) = 500.0
    • round(380.651, -2) = 400.0
  4. 양수를 반올림하고, 반올림 자리가 양수인 경우:
    • round(226.024, 2) = 226.02
    • round(290.004, 1) = 290.0
    • round(304.254, 2) = 304.25

(GPT 고마워!) round(반올림할 숫자, 반올림 범위)를 지정하여 위와 같이 사용할 수 있다. 

그런데 내가 이 글을 포스팅하는 이유, round함수에 대해 신경쓰지 못했던 부분이 있다.

바로 x.5 일 경우 Python 의 built-in round()함수는 버림을하는가 올림을하는가?

핵심 질문 Q. 파이썬의 round함수는 .5에 대해 올림을할까요 내림을할까요?

정답은 "경우에 따라 둘 다 진행한다"

이 경우를 확인하게 된건 백준문제의 18110번 : solved.ac 문제를 풀 때 알게 되었다. (문제이동: http://boj.kr/18110)

논리상 전혀 문제가 없는데 계속 틀렸습니다가 나오길래,,, 아마 왜 틀렸는지 모르겠다 하시는 분들은 모두 아래의 반례 사례일 것 같다.

입력:
2
2
3
예상 출력:
3
실제 출력:
2

아! Python에서는 2.5에 대해 round() 사용하면 버림을 하는구나!
그래서 1.5, 2.5를 round에 통과시켜봤더니

print(round(1.5))
print(round(2.5))

# 결과:
# 2
# 2

2로 동일한 값이 나온 것을 확인했다. 엥?

결론

Python의 round는 Bankers' Rounding 형식을 따르며 이는 .5에 대해 가장 가까운 짝수로 반올림 하는 형식을 의미한다.
통계적으로 반올림에 의한 오류를 줄이는 데 도움이 되며, 장기적으로는 데이터의 편향을 최소화하는 효과가 있다고 알려져있다.

만약 올림을 하고 싶다면 0.5를 더하고 math.floor로 버림을 하자! 아래 코드처럼 왜 올림이 되는지는 직접 해보면 쉽게 알 수 있다.

def round_up_half(number):
    import math
    # 0.5 더한 후 내림을 하여 올림 효과를 낸다
    return math.floor(number + 0.5)

( 반대로 버림을 하고싶으면 0.5를 빼고 math.ceil을 하면 된다는 것은 금방 알 수 있다.)