source

왜 그럴까요?NET은 은행원 반올림을 기본값으로 사용합니까?

factcode 2023. 5. 9. 23:02
반응형

왜 그럴까요?NET은 은행원 반올림을 기본값으로 사용합니까?

설명서에 따르면 이 방법은 대부분의 응용 프로그램에서 일반적이지 않은 반올림 알고리즘을 사용합니다.그래서 저는 항상 더 자연스러운 반올림 알고리즘을 수행하기 위해 사용자 정의 함수를 작성하게 됩니다.

public static decimal RoundHalfUp(this decimal d, int decimals)
{
    if (decimals < 0)
    {
        throw new ArgumentException("The decimals must be non-negative", 
            "decimals");
    }

    decimal multiplier = (decimal)Math.Pow(10, decimals);
    decimal number = d * multiplier;

    if (decimal.Truncate(number) < number)
    {
        number += 0.5m;
    }
    return decimal.Round(number) / multiplier;
}

이 프레임워크 설계 결정의 배경을 아는 사람이 있습니까?

프레임워크에 반올림 알고리즘을 내장한 구현이 있습니까?아니면 관리되지 않는 윈도우즈 API일 수도 있습니다.

초보자가 단순히 글을 쓰는 것은 오해의 소지가 있을 수 있습니다.decimal.Round(2.5m, 0)결과적으로 3을 기대하고 대신 2를 받는 것.

은행가 알고리즘(이른바 절반에서 짝수)이 좋은 선택인 이유가 있는 다른 대답은 꽤 맞습니다.대부분의 합리적인 분포에 대해 0 방법에서 벗어난 반올림만큼 음의 치우침이나 양의 치우침을 겪지 않습니다.

하지만 문제는 그 이유였습니다.NET은 Banker의 실제 반올림을 기본값으로 사용합니다. Microsoft는 IEEE 754 표준을 준수했습니다.이는 MSDN for Math에서도 언급됩니다.비고 아래에서 반올림합니다.

또한 참고하십시오.NET은 다음을 제공함으로써 IEEE에 의해 지정된 대안적인 방법을 지원합니다.MidpointRounding열거형의물론 그들은 유대 관계를 해결하기 위한 더 많은 대안을 제공할 수 있었지만, 그들은 단지 IEEE 표준을 충족하기로 선택했습니다.

아마도 그것이 더 나은 알고리즘이기 때문일 것입니다.수행된 많은 반올림 과정에서 모든 .5의 끝이 동일하게 위아래로 반올림된다는 것을 평균화할 수 있습니다.예를 들어 반올림한 숫자를 여러 개 추가하면 실제 결과를 더 잘 추정할 수 있습니다.저는 그것이 일부 사람들이 기대하는 것은 아닐지라도, 아마도 그것이 더 옳은 일이라고 말하고 싶습니다.

"Microsoft의 디자이너들은 왜 이것을 기본값으로 선택했는가?"라는 질문에 대답할 수는 없지만, 저는 단지 추가 기능이 필요하지 않다는 것을 지적하고 싶습니다.

Math.Round 를 지정할 수 있습니다.

  • 짝수로 - 숫자가 두 개의 다른 숫자 사이의 중간에 있을 때 가장 가까운 짝수를 향해 반올림됩니다.
  • 0에서 멀어짐 - 숫자가 두 개의 다른 숫자 사이의 중간에 있을 때 숫자는 0에서 가장 가까운 숫자를 향해 반올림됩니다.

십진법은 주로 돈을 위해 사용됩니다; 은행원들의 반올림은 돈을 가지고 일할 때 일반적입니다.라고 말할 수도 있습니다.

십진법이 필요한 것은 대부분 은행가들이기 때문에 "은행가의 반올림"을 합니다.

은행가 반올림은 다음과 같은 경우 평균적으로 동일한 결과를 얻을 수 있다는 이점이 있습니다.

  • 추가하기 전에 일련의 "선"을 반올림합니다.
  • 또는 그것들을 더해서 전체를 반올림합니다.

계산하기 전에 반올림하면 컴퓨터를 사용하기 전 며칠 동안 많은 작업이 절약됩니다.

(영국에서 우리가 십진수 은행에 갔을 때는 0.5펜스를 취급하지 않았지만, 여러 해 동안 여전히 0.5펜스 동전이 있었고 상점은 종종 0.5펜스로 끝나는 가격이 있었다.

다음과 같은 라운드 함수의 다른 오버로드를 사용합니다.

decimal.Round(2.5m, 0,MidpointRounding.AwayFromZero)

출력은 3입니다.그리고 만약 당신이

decimal.Round(2.5m, 0,MidpointRounding.ToEven)

당신은 은행원들의 반올림을 받을 것입니다.

언급URL : https://stackoverflow.com/questions/311696/why-does-net-use-bankers-rounding-as-default

반응형