값을 가장 가까운 10 간격으로 반올림하는 .Net 알고리즘 내장

StackOverflow https://stackoverflow.com/questions/274439

  •  07-07-2019
  •  | 
  •  

문제

C#에서 값을 10 간격으로 반올림하는 방법은 무엇입니까?예를 들어, 11이 있으면 10을 반환하고, 136이 있으면 140을 반환하고 싶습니다.

손으로 쉽게 할 수 있어요

return ((int)(number / 10)) * 10;

하지만 저는 이 작업을 수행하기 위해 Math.Round()와 같은 내장 알고리즘을 찾고 있습니다.내가 직접 작업을 수행하고 싶지 않은 이유는 위와 같이 간단한 작업이라도 내 프로젝트 전체에 걸쳐 동일하거나 유사한 코드 조각을 작성하고 싶지 않기 때문입니다.

도움이 되었습니까?

해결책

클래스 라이브러리에는 이 작업을 수행하는 기본 제공 함수가 없습니다.가장 가까운 것은 시스템.수학.라운드() 이는 Decimal 및 Double 유형의 숫자를 가장 가까운 정수 값으로 반올림하는 데에만 사용됩니다.그러나 .NET 3.5로 작업하는 경우 확장 메서드로 명령문을 래핑할 수 있습니다. 이렇게 하면 함수를 훨씬 더 깔끔하게 사용할 수 있습니다.

public static class ExtensionMethods
{
    public static int RoundOff (this int i)
    {
        return ((int)Math.Round(i / 10.0)) * 10;
    }
}

int roundedNumber = 236.RoundOff(); // returns 240
int roundedNumber2 = 11.RoundOff(); // returns 10

이전 버전의 .NET 프레임워크에 대해 프로그래밍하는 경우 RoundOff 함수에서 "this"를 제거하고 다음과 같이 함수를 호출하세요.

int roundedNumber = ExtensionMethods.RoundOff(236); // returns 240
int roundedNumber2 = ExtensionMethods.RoundOff(11); // returns 10

다른 팁

수학을 사용하여 항상 반올림하십시오.

int number = 236;
number = (int)(Math.Ceiling(number / 10.0d) * 10);

모듈러스 (%)는 나머지를 얻으므로 다음을 얻습니다.

// number = 236 + 10 - 6

확장 방법에 넣으십시오

public static int roundupbyten(this int i){
    // return i + (10 - i % 10); <-- logic error. Oops!
    return (int)(Math.Ceiling(i / 10.0d)*10); // fixed
}

// call like so:
int number = 236.roundupbyten();

위의 편집 : 나는 수학을 사용하기 위해 첫 번째 본능과 함께 가야 했어

UPC 체크 숫자를 계산할 때 이것에 대해 블로그를 작성했습니다.

이것은 너무 늦었을 수도 있지만 언젠가 좋은 도움이 될 것 같아요 ...

나는 이것을 시도했다 :

public int RoundOff(int number, int interval){
    int remainder = number % interval;
    number += (remainder < interval / 2) ? -remainder : (interval - remainder);
    return number;
}

사용:

int number = 11;
int roundednumber = RoundOff(number, 10);

이런 식으로, 당신은 간격의 절반이 반올림되거나 반올림되는지 여부에 관계없이 옵션이 있습니다. =))

플로트를 정수로 반올림하는 것은 단순히 x를 주조하는 것과는 달리 (int) (x+0.5)와 유사합니다. 10의 배수를 원한다면 쉽게 적응할 수 있습니다.

정수 수학을하고 10으로 반올림하는 경우 (x+10/2)/10*10을 시도하십시오.

편집하다: 나는이 응답이 원래의 저자의 요청을 충족시키지 못하고, 내가하지 않는 것을 선호하는 편견의 반올림 형식이라는 것을 알았습니다. 그러나 또 다른 허용 된 응답은 이미 훨씬 더 나은 솔루션 인 Math.round ()를 언급했습니다.

오래된 질문이지만 여기에 요청 된 것을 수행하는 방법이 있습니다. 그리고 나는 원하는 시그 무화과의 수로 숫자를 반올림 할 수 있도록 확장했습니다.

    private double Rounding(double d, int digits)
    {
        int neg = 1;
        if (d < 0)
        {
            d = d * (-1);
            neg = -1;
        }

        int n = 0;
        if (d > 1)
        {
            while (d > 1)
            {
                d = d / 10;
                n++;
            }
            d = Math.Round(d * Math.Pow(10, digits));
            d = d * Math.Pow(10, n - digits);
        }
        else
        {
            while (d < 0.1)
            {
                d = d * 10;
                n++;
            }
            d = Math.Round(d * Math.Pow(10, digits));
            d = d / Math.Pow(10, n + digits);
        }

        return d*neg;
    }


   private void testing()
   {
       double a = Rounding(1230435.34553,3);
       double b = Rounding(0.004567023523,4);
       double c = Rounding(-89032.5325,2);
       double d = Rounding(-0.123409,4);
       double e = Rounding(0.503522,1);
       Console.Write(a.ToString() + "\n" + b.ToString() + "\n" + 
           c.ToString() + "\n" + d.ToString() + "\n" + e.ToString() + "\n");
   }

나는 가져 오지 않는 것을 선호합니다 Math 라이브러리 나 플로팅 포인트로 이동하여 내 제안은 다음 1K까지 반올림하는 곳에서와 같이 정수 산술을 수행합니다. 반복하고 싶지 않은 경우 방법이나 람다 스 니펫이나 무언가로 싸십시오.

int MyRoundedUp1024Int = ((lSomeInteger + 1023) / 1024) * 1024;

나는 이것에 대해 성능 테스트를 실행하지 않았지만 다른 방법으로는 가장 빠른 방법이라고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top