개요
Python의 round 함수는 소수를 지정한 자릿수에 맞춰 반올림하는 함수이다. 반올림하는 자리의 수가 5보다 적으면 버리고, 5보다 크면 올린다. 그러나 실제로 몇 가지 예시로 round 함수를 수행하면 기대한 결과와 다른 결과가 나온다.
왜 이러한 결과가 나오는지 적어둔다.
Bankers' Rounding
이번에 처음 알게 되었는데 반올림을 하는 방법은 여러가지가 존재한다. 그중 하나인 산술 반올림은 반올림하는 자리의 수가 5보다 적으면 버리고, 5보다 크면 올리는, 일반적으로 알고 있는 반올림 방식을 말한다. 다만 산술 반올림은 대상이 되는 숫자가 5 이상이면 올리기 때문에, 내리는 경우보다 올리는 경우가 더 많다. 산순 반올림은 단순 계산에서는 큰 차이가 없지만 돈과 관련된 예민한 계산에서는 큰 차이를 야기할 수 있다.
따라서 자릿수를 고르게 올리고 내릴 수 있도록 은행원들이 고안한 반올림 방식을 Bankers' Rounding(은행 가의 반올림)이라고 한다. 은행가의 반올림 방식은 반올림하는 자리의 수가 5인 경우, 2와 나누어 떨어지는 가장 가까운 수로 반올림하는 방식이다. 때문에 반올림하는 대상의 앞자리가 짝수인 경우에는 내리고, 홀수인 경우에는 올린다.
산술 반올림 vs 은행가의 반올림
실제 반올림 예시로 산술 반올림과 은행가의 반올림 방식 각각으로 계산한 결과를 비교해 본다. 아래 표는 실수 3개를 실제 값, 산술 반올림, 은행가의 반올림 방식으로 소수 2자리로 반올림한 결과의 합을 비교한 것이다.
방법 | 실제 값 | 산술 반올림 | 은행가의 반올림 |
1 | 54.1754 | 54.18 | 54.18 |
2 | 343.2050 | 343.21 | 343.20 |
3 | 106.2038 | 106.20 | 106.20 |
합계 | 503.5842 | 503.59 | 503.58 |
두 방식의 오차를 비교해보면 산술 반올림 방식이 0.0058이고, 은행가의 반올림 방식이 0.0042으로 은행가의 반올림 방식이 좀 더 정확한 것을 확인할 수 있다.
때문에 Python을 포함하는 많은 프로그래밍 언어에서 은행가의 반올림으로 round 함수를 제공하고 있다.
참고 문서
https://sjkoding.tistory.com/55
은행가의 반올림(Banker’s Rounding)에 대한 단상.
https://www.officetutor.co.kr/board/faq_lib/frm_vba_content.asp?page=2&idx=20