본문 바로가기

2. 정보영재교육 수업 자료

[336] python 반올림(round) 주의사항 및 사사오입 구현하기

1. 반올림의 종류

https://ko.wikipedia.org/wiki/반올림

 

반올림 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

가. 사사오입

우리가 흔히 알고 있는 반올림입니다.

반올림하고자 하는 자릿수가 5일 경우 올립니다.

예를 들어, 5.5와 6.5를 소수 첫째 자리에서 반올림하면 각각 6와 7이 됩니다.

나. 오사오입

통계학과 공학에서 사용하는 반올림입니다.

반올림하고자 하는 자릿수가 5일 경우, 그 앞 자릿수가 짝수면 버리고, 홀수면 올립니다.

즉, 반올림된 자릿수는 무조건 짝수가 됩니다.

예를 들어, 5.5와 6.5를 소수 첫째 자리에서 반올림하면 둘 다 6이 됩니다.

2. 파이썬의 round 함수

파이썬의 round 함수는 오사오입의 반올림을 사용합니다.

위의 예시를 파이썬에 입력하면 다음과 같이 오사오입임을 알 수 있습니다.

>>> round(5.5)
6

>>> round(6.5)
6

 

3. 사사오입 구현 방법 3가지(소수 첫째 자리에서 반올림)

파이썬의 round 함수는 오사오입이므로, 사사오입을 원한다면 직접 구현하여야 합니다.

사사오입을 구현하는 여러 방법을 알아봅시다.

가. 절대값에서 0.5를 더한 후 내림

가장 쉽고 흔하게 사용됩니다. 음수일 때 처리를 위해 절대값을 사용하며 부호에 조심합니다.

def my_round(f: float) -> int:
    res = int(abs(f) + 0.5)
    return res if f >= 0 else -res

나. 절대값에서 미세한 값을 더한 후 round 함수 사용

주어진 수에 영향을 주지 않는 미세한 값을 더한 후 round 함수를 사용하면 사사오입과 같은 결과를 얻을 수 있습니다.

음수일 경우를 고려해 부호를 조심합니다.

def my_round(f: float) -> int:
    res = round(abs(f) + 0.0000001) # 주어진 수에 영향을 주지 않는 작은 수
    return res if f >= 0 else -res

다. 직접 구현

직접 사사오입을 구현하여 사용할 수도 있습니다.

def my_round(n: float) -> int:
    decimal = f - int(f)
    if n >= 0:
    	return int(f) if decimal < 0.5 else int(f+1)
    return int(f) if decimal > -0.5 else int(f-1)

4. 왜 오사오입을 사용할까요?

사사오입은 편하게 무조건 5면 올리면 됩니다.

하지만 앞자리수가 짝수인지 홀수인지 따져서 버리고, 올리는 오사오입을 왜 사용할까요?

예시를 통해 알아봅시다. 

8.5, 9.5, 10.5, 11.5

이 네 수가 있을 때, 총합은 40이고 평균은 10입니다.

사사오입: 9, 10, 11, 12(평균값: 10.5)
오사오입: 8, 10, 10, 12(평균값: 10)

반올림을 하게 되면 결국 원래의 값에서 오차가 생기게 됩니다.

반올림의 경우 0.5만큼의 오차가 생기게 되고, 따라서 평균값에도 오차가 생기게 됩니다.

사사오입의 경우 반올림을 하게 되면 무조건 +0.5만큼의 오차가 생기게 됩니다.

하지만 오사오입의 경우 짝수면 -0.5, 홀수면 +0.5만큼의 오차가 생겨, 결국 오사오입의 평균 오차는 사사오입의 평균 오차와 같거나 더 작게 됩니다.