Math.Round
함수를 사용 중에 예상하는 값과 다른 결과가 나오는 경우가 생겼다.0.5
를 반올림 했을 때 1
이 아닌 0
이 나오는 경우가 생겼다.Math.Round
의 기본 설정이 은행가의 반올림이기 때문이었다.은행가의 반올림이란, 0.5이하는 버리고 0.5이상이면 올리는데, 정확하게 0.5이면 가장 가까운 짝수로 올리거나 내리는 것이다.
가령 12.5에서 0.5는 버려지고 12로 만들지만 13.5는 0.5를 더하여 14가 된다.
일반적으로 사용하는 사사오입과 달라 비합리적으로 보이지만, 통계적으로 더 정확한 방법이라고 한다. 아래 설명을 보자.
가령 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개의 숫자를 나누어 갖게 됩니다.
따라서 한쪽에 치우치지 않는 공평한 셈이 됩니다.
경제학은 물론, 프로그래밍에서도 많이 사용된다. 특히, 앞으로 설명할 C#의 반올림은 기본적으로 은행가의 반올림을 적용한다.
값을 가장 가까운 정수나 지정된 소수 자릿수로 반올림한다.
C#의 System
네임스페이스로 사용이 가능하다.
double
인수를 double
결과값으로 반환한다.
두 가지 반올림 규칙을 지원한다.
MidpointRounding.AwayFromZero
: 일반적인 사사오입 규칙이다.
MidpointRounding.ToEven
: 은행가의 반올림을 적용한다. 기본적으로 적용된다.
소수점 아래 반올림하는 자릿수를 정할 수 있다.
값을 가장 가까운 정수로 반올림한다.
Unity에서 기본적으로 지원한다.
float
인수를 float
결과값으로 반환한다.
기본적으로 은행가의 반올림을 적용한다.
소수점 아래 반올림하는 자릿수를 정할 수 없어, 아래 방법을 사용할 수 있다.
float a = Mathf.Round(3.56f); // 4.0f
float a = Mathf.Round(3.56f * 10) * 0.1f; // 3.6f