배움터  
  HOME > 배움터 > Daily Tip
Daily Tip

제품:   Excel 버전:   공통
검색어:   반올림, CInt, CLng
제목:   은행원의 반올림은 무죄인가?
     
 

새 페이지 2

  STEP> Banker’s rounding의 원리
반올림문제가 그리 큰 문제가 아닌 것처럼 보이지만 수 백억 원이 오고 가는 금융권에서는 이것으로 인해 적지 않은 금액의 계산이 달라집니다. 대개의 프로그래밍 언어들은 반올림의 방법으로서 "Banker’s rounding"를 사용합니다.

많은 사람들이 이 반올림 방법이 상식적으로 틀린 결과를 돌려주기 때문에 싫어하지만 아이러니컬하게도 이것은 가장 정확한 라운딩(rounding)방법으로서 개발된 것입니다.

이 방법은 0.5이하는 버리고 0.5이상이면 올립니다. 그리고 정확하게 0.5이면 가장 가까운 짝수로 올립니다. 가령 12.5에서 0.5는 버려지고 12로 만들지만 13.5는 0.5를 더하여 14가 됩니다. Bankers rounding은 Gauss법을 사용하는 것으로 이는 0.5인 경우 2로 나누어질 수 있는 가장 가까운 수로 반올림 한다는 것입니다.

1.5 is rounded to 2
2.5 is rounded to 2
3.5 is rounded to 4
4.5 is rounded to 4

종종 이러한 방법이 일상적인 반올림(Standard Rounding) 상식과 어긋나지만 이 방법은 다음과 같은 정당성을 가집니다.

가령 12.0부 터 13.0사이를 0.1씩의 간격으로 나누면 9개의 값이 들어갑니다. 12.1, 12.2, 12.3, 12.4, 12.5, 12.6, 12.7, 12.8, 12.9 그리고 이 값들은 반올림의 대상이 됩니다. 상식적인 반올림이라면 9개의 숫자 중 5개는 올리고 4개는 버리게 됩니다. 그러나 이 방법은 공평하지 않다. 1/9만큼 한쪽은 더 가지고 한쪽은 부족하게 됩니다.

그러나 0.5에서 가장 가까운 짝수로 옮기도록 하게 되면 어떻게 될까요?  12.0 부터 14.0까지 18개의 반올림 대상이 생기고 버리는 쪽이나 올리는 쪽 모두 9개의 숫자를 나누어 갖게 됩니다. 따라서 한쪽에 치우치지 않는 공평한 셈이 됩니다.

  STEP> 반올림의 비교

이번에는 실제 반올림 예를 가지고 Banker’s roundingStandard Rounding비교하여 Banker’s rounding이 반드시 나쁜 것만은 아니라는 것을 보여 드리겠습니다.

다음의 표는 실수 3개를 대상으로 Banker’s rounding, Standard Rounding의 합계와 반올림을 전혀 하지 않은 합계를 비교하고 있습니다.

방법

반올림하지 않는 경우

Standard Rounding

Banker's Rounding

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

반올림하지 않은 합계와 비교해볼 때 각각의 오차는 Banker’s rounding이 0.0042, Standard Rounding이 -0.0058이다. Banker’s rounding이 더 정확합니다.

다시 소수점 1자리로 반올림하는 경우를 살펴 보도록 하겠습니다.

방법

반올림하지 않는 경우

Standard Rounding

Banker's Rounding

1

27.25

27.3

27.2

2

27.45

27.5

27.4

3

27.55

27.6

27.6

 합계

82.25

82.4

82.2

반올림하지 않은 합계와 비교해볼 때 각각의 오차는 Banker’s rounding이 0.05, Standard Rounding이 -0.15 입니다. 마찬가지로 Banker’s rounding이 더 정확합니다.

어쨌든 그래도 많은 사람들은 0.5는 올려 버리는 반올림을 선호합니다.
 

  Tip> VBA 관련함수
Single, Double과 같이 수치 데이터 형은 각각 지원하는 반올림의 정밀도가 다릅니다. 따라서 이들을 다른 데이터 형으로 형 변환(타입 캐스팅)하는 경우 자동적으로 반올림이 생깁니다.

CInt()함수와 CLng()함수는 integer 또는 long integer 데이터 형으로 변환하는 함수로서 분수를 정수로 반올림합니다.

이 함수들의 특징은 0.5로 끝나는 수치를 반올림 또는 버림을 하여 결과를 항상 짝수가 되도록 합니다. CInt(12.5)는 12이고 CInt(11.5) 역시 12입니다. 즉 "Banker’s rounding"을 한다는 얘기입니다.