은행가의 반올림

Jinho Lee·2024년 11월 4일
0

개요

  • Math.Round 함수를 사용 중에 예상하는 값과 다른 결과가 나오는 경우가 생겼다.
  • 내가 예상한 결과는 사사오입이었다.
  • 결과는 예를 들어, 0.5를 반올림 했을 때 1이 아닌 0이 나오는 경우가 생겼다.
  • 그 원인은 Math.Round의 기본 설정이 은행가의 반올림이기 때문이었다.
  • 후에 같은 문제가 생기지 않도록 은행가의 반올림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#의 반올림은 기본적으로 은행가의 반올림을 적용한다.

Math.Round

  • 값을 가장 가까운 정수나 지정된 소수 자릿수로 반올림한다.

  • C#의 System 네임스페이스로 사용이 가능하다.

  • double 인수를 double 결과값으로 반환한다.

  • 두 가지 반올림 규칙을 지원한다.

    • MidpointRounding.AwayFromZero : 일반적인 사사오입 규칙이다.

    • MidpointRounding.ToEven : 은행가의 반올림을 적용한다. 기본적으로 적용된다.

  • 소수점 아래 반올림하는 자릿수를 정할 수 있다.

Mathf.Round

  • 값을 가장 가까운 정수로 반올림한다.

  • Unity에서 기본적으로 지원한다.

  • float 인수를 float 결과값으로 반환한다.

  • 기본적으로 은행가의 반올림을 적용한다.

  • 소수점 아래 반올림하는 자릿수를 정할 수 없어, 아래 방법을 사용할 수 있다.

    float a = Mathf.Round(3.56f); // 4.0f
    float a = Mathf.Round(3.56f * 10) * 0.1f; // 3.6f

참고

0개의 댓글

관련 채용 정보