728x90

결론부터 말하자면 Python의 round함수는 오사오입을 사용한다.

 

사사오입과 오사오입은 숫자를 반올림하는 두 가지 방법이다. 이들은 소수점 이하의 숫자를 처리할 때 사용되며, 각각의 방식은 두 가지이다.

사사오입(Round Half Up)이란?


5 이상에서 올리고, 5 미만은 버리는 것이 우리가 알고 있는 반올림 방식인 사사오입이며 Round Half Up이라고 한다.

일반적으로 알고 있는 반올림이다. 소수점 0부터 5까지는 파이썬의 floor 함수를 사용하는 것과 같고, 소수점이 5를 초과할 때부터는 파이썬의 ceil 함수와 동일하다.

그림으로 표현하면 다음과 같으며, 프로그램 실행 시 다음과 같이 결과가 나온다.

혹시 코드가 필요한 사람이 있을 수 있으므로 코드도 첨부하겠다.

from math import floor, ceil

def custom_round(num):
    if num % 1 >= 0.5:
        return int(ceil(num))
    else:
        return int(floor(num))

for i in range(-4,4):
    print(f"{i+0.5} 반올림 : {custom_round(i+0.5)}")

 

오사오입(Round Half to Even / Banker's Rounding) 이란?


그렇다면 사사오입이 아닌 오사오입은 무엇일까? 

이 방법은 반올림할 숫자가 정확히 반 (즉,.5) 일 때 가장 가까운 짝수로 반올림하는 방식이다. 예를 들어 2.5는 2, 3.5는 4로 반올림된다.

숫자의 소수점이 .5 일 때 반올림을 하게 되면 가장 가까운 짝수로 출력되는 것을 볼 수 있다.

 

 

 

그래서 왜 사용하는데?

사용하는 이유


주된 목적은 반올림 과정에서 발생하는 오류를 최소화하기 위해서 사용한다. 

사사오입 방식

  • 3.5는 4로 반올림 
  • 4.5는 5로 반올림 
  • 5.5는 6으로 반올림 
  • 6.5는 7로 반올림 
  • 평균 반올림 값 = (4 + 5 + 6 + 7) / 4 = 5.5
  • 실제 평균 = 5.0

실제 평균과 사사오입 평균이 0.5가 차이 나는 것을 볼 수 있다.

오사오입 방식

  • 3.5는 4로 반올림 (4는 짝수) 
  • 4.5는 4로 반올림 (4는 짝수) 
  • 5.5는 6으로 반올림 (6은 짝수) 
  • 6.5는 6로 반올림 (6은 짝수) 
  • 평균 반올림 값 = (4 + 4 + 6 + 6) / 4 = 5.0
  • 실제 평균 = 5.0

실제 평균과 오사오입의 평균의 오차가 줄어든 것을 볼 수 있다.

위의 예시를 통해 반올림으로 발생하는 총합의 증가나 감소가 장기적으로 상쇄되어, 데이터 셋의 평균값이 실제 값에 더 가깝게 유지되기 때문에 파이썬의 round 함수는 오사오입 방식을 사용한다.

 

이 방식을 알게 된 이유는 백준문제이다.

https://www.acmicpc.net/problem/18110

그리고 이 문제와 관련된 해설은 다음 글에서 확인할 수 있다.

https://giliit.tistory.com/79