[C#] Excel 반올림 함수 Round, RoundUp, RoundDown C# 버전

9530 단어 Excel
원문:
[C#] Excel 반올림 함수 Round, RoundUp, RoundDown C# 버전
본인은 C#에서 소수 반올림을 할 때 Excel의 Round, Round Up, Round Down이라는 몇 가지 함수를 그리워합니다. 그 이유는 후자의'접지기'입니다. 우리 서민들의 반올림 요구에 비교적 부합됩니다. 어떤'은행가 반올림법'은 은행에서 사용하도록 하세요.오늘 시간이 있으면 그것을 실현하고 먼저 이 몇 개의 Excel 함수의 기능을 복습해 봅시다.
Round(value, digits)
value를 반올림법에 따라 반올림하고digits위 소수를 보존한다.digits가 마이너스일 때 소수점 왼쪽에서 반올림하기;value가 마이너스일 때, 표현은 정수와 완전히 상반된다.
예: Round(3.145,2) = 3.15;Round(-3.145, 2) = -3.15;Round(3145, -2) = 3100
RoundUp(value, digits)
0에서 멀리 떨어진 방향으로value를 위로 반올림하고digits 비트 소수를 유지합니다.digits가 마이너스일 때, 소수점 왼쪽에서 반올림
예: RoundUp(3.111,2) = 3.12;RoundUp(-3.111, 2) = -3.12;RoundUp(3111, -2) = 3200
RoundDown(value, digits)
0에 가까운 방향으로value를 아래로 반올림하고digits 비트 소수를 유지합니다.digits가 마이너스일 때, 소수점 왼쪽에서 반올림
예: RoundDown(3.145,2) = 3.14;RoundDown(-3.145, 2) = -3.14;RoundDown(3145, -2) = 3100
실현 원리:
- RoundUp과 RoundDown의 경우 decimal 또는 Math 클래스의 Ceiling과 Floor 방법(이하 C/F)은 정돈만 가능하기 때문에 보존할 비트에 따라 C/F 방법으로 발휘할 수 있는 새로운 값을 곱한 다음 C/F를 이용하여 반올림된 값을 얻은 다음 곱하기/나누어 최종 결과를 얻을 수 있습니다.이 방법은 시중에서 흔히 볼 수 있다.
예: 1.114 상향 보류 2위, 우선 1.114x100 111.4, C (111.4) 로 112, 그리고 112/100, 최종 1.12
문제: 원값을 먼저 곱해야 하기 때문에 Max/Min에 가깝거나 정밀도가 너무 높은 원값에 대해서는 이 단계가 넘칠 수 있기 때문에 Up과 Down은 특별한 값에 대응할 수 없지만 일상적인 응용은 문제없다고 믿는다.
- Roundex 방법의 경우 decimal을 직접 봉인합니다.Round(decimal, Midpoint Rounding. Away FromZero)가 결과를 얻었습니다.
구현 지침:
- 확장 방법으로 제공되며 일반적인 방법 호출 방식을 호환합니다(쓸데없는 말).3.145M이 가능합니다.RoundEx(2), MathEx도 가능합니다.RoundEx(3.145M, 2)
- 각 방법은 decimal과 double 두 가지 유형으로 재부팅됩니다. 총 6가지 방법
- decimal 형식을 바탕으로 이루어지며, 더블 버전은 + 형식 변환만 다시 사용합니다.더블을 실현하지 않는 이유는 게으름을 피우기 때문이 아니라 부동점 연산이 쉽게 엉망이 되기 때문이다. 예를 들어 555.55x100=5554.99999993.부동 소수점 연산의 신뢰성에 대해서는 다음을 참조하십시오http://www.cnblogs.com/ethancai/articles/1237012.html
- 반올림 함수가 Roundex라고 명명된 것은 decimal 클래스에 Round라는 정적 방법이 이미 존재하기 때문에 잘 열리면 확장 방식으로 3M을 사용할 수 없습니다.Round()를 호출합니다.그리고 비록.net는 명칭에 있어서 매우 큰 포용도를 가지고 있지만, 나는 FCL의 명칭을 최대한 피하는 것이 좋다고 생각한다. 무의미하게도 이런 자유를 누리는 것은
- 몇 가지 방법이 보존 비트를 먼저 판단하고 10의digits를 직접 사용하지 않고 연산하는 이유는 decimal 유형의 원생 방법을 최대한 따라 불필요한 수학 연산을 줄이려는 것이다.우리가 추구하는 것은 아주 간단한 코드가 아니라 성능이다.물론 테스트를 해본 적이 없죠~ 계란이 날아오는 중...
쓸데없는 말을 늘어놓고 코드를 눌러라.
/// <summary>

///   /// </summary>

public static class MathEx { /// <summary>

    ///   0   /// </summary>

    public static decimal RoundUp(this decimal value, sbyte digits) { if (digits == 0) { return (value >= 0 ? decimal.Ceiling(value) : decimal.Floor(value)); } decimal multiple = Convert.ToDecimal(Math.Pow(10, digits)); return (value >= 0 ? decimal.Ceiling(value * multiple) : decimal.Floor(value * multiple)) / multiple; } /// <summary>

    ///   0   /// </summary>

    public static decimal RoundDown(this decimal value, sbyte digits) { if (digits == 0) { return (value >= 0 ? decimal.Floor(value) : decimal.Ceiling(value)); } decimal multiple = Convert.ToDecimal(Math.Pow(10, digits)); return (value >= 0 ? decimal.Floor(value * multiple) : decimal.Ceiling(value * multiple)) / multiple; } /// <summary>

    ///   /// </summary>

    public static decimal RoundEx(this decimal value, sbyte digits) { if (digits >= 0) { return decimal.Round(value, digits, MidpointRounding.AwayFromZero); } decimal multiple = Convert.ToDecimal(Math.Pow(10, -digits)); return decimal.Round(value / multiple, MidpointRounding.AwayFromZero) * multiple; } /// <summary>

    ///   0   /// </summary>

    public static double RoundUp(this double value, sbyte digits) { return decimal.ToDouble(Convert.ToDecimal(value).RoundUp(digits)); } /// <summary>

    ///   0   /// </summary>

    public static double RoundDown(this double value, sbyte digits) { return decimal.ToDouble(Convert.ToDecimal(value).RoundDown(digits)); } /// <summary>

    ///   /// </summary>

    public static double RoundEx(this double value, sbyte digits) { return decimal.ToDouble(Convert.ToDecimal(value).RoundEx(digits)); } }

- 문필 -

좋은 웹페이지 즐겨찾기