값을 가장 가까운 10 간격으로 반올림하는 .Net 알고리즘 내장
C #에서 값을 10 간격으로 반올림하는 방법은 무엇입니까? 예를 들어 11 개가 있으면 10을 반환하고 136이 있으면 140을 반환합니다.
손으로 간단하게 할 수 있습니다
return ((int)(number / 10)) * 10;
그러나 Math.Round ()와 같은이 작업을 수행하는 내장 알고리즘을 찾고 있습니다. 내가 손으로하고 싶지 않은 이유는 위와 같이 간단한 일도 내 프로젝트 전체에 동일하거나 코드를 작성하고 싶지 않습니다.
이를 수행하는 클래스 라이브러리에는 내장 함수가 없습니다. 가장 가까운 것은 Decimal 및 Double 유형의 숫자를 가장 가까운 정수 값으로 반올림하는 데만 사용되는 System.Math.Round () 입니다. 그러나 .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
Math.Ceiling을 사용하여 항상 반올림하십시오.
int number = 236;
number = (int)(Math.Ceiling(number / 10.0d) * 10);
Modulus (%)는 나머지를 얻습니다.
// 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();
위 편집 : 나는 Math.Ceiling을 사용하는 첫 번째 본능을 가지고 가야했습니다.
나는 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);
이렇게하면 간격의 절반을 반올림할지 반올림할지 여부를 선택할 수 있습니다. =)
float를 정수로 반올림하는 것은 (int) (x + 0.5)와 유사하지만 x를 일치하는 것과 대조적으로 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;
나는 다른 방법과 비교하여 성능 테스트를 실행하지 않았지만 이것이 비트 버전의 이동 및 회전을 절약하는 가장 빠른 방법이라고 확신합니다.
'ProgramingTip' 카테고리의 다른 글
SSL에 대한 Apache 2.4 구성이 작동하지 않음 작동 (0) | 2020.11.27 |
---|---|
ASP.NET에서 버튼 태그를 어떻게 사용할 수 있습니까? (0) | 2020.11.27 |
브라우저가 개행을 공백으로 기술하는 이유는 무엇입니까? (0) | 2020.11.27 |
Windows 탐색기에서 파일 목록을 텍스트로 복사 (0) | 2020.11.27 |
! =는 OCaml에서 의미가 있습니까? (0) | 2020.11.27 |