簡體   English   中英

在 C# 中四舍五入到小數點后 2 位

[英]Rounding up to 2 decimal places in C#

我有一個十進制數,如下所示:

189.182

我想將其四舍五入到小數點后 2 位,因此 output 如下:

189.19

Math class 或其他東西中是否有內置功能? 我知道天花板 function 存在,但這似乎沒有做我想要的 - 它會四舍五入到最接近的 int,所以在這種情況下只是 '189'。

乘以 100,調用上限,除以 100 可以滿足我的要求

public static double RoundUp(double input, int places)
{
    double multiplier = Math.Pow(10, Convert.ToDouble(places));
    return Math.Ceiling(input * multiplier) / multiplier;
}

用法如下所示:

RoundUp(189.182, 2);

這通過將小數點向右移動 2 位(因此它在最后 8 位的右側)然后執行天花板操作,然后將小數點移回其原始 position 來工作。

您可以使用:

decimal n = 189.182M;
n = System.Math.Ceiling (n * 100) / 100;

可以在此處找到各種舍入函數的說明。


請注意,像這樣的公式仍然受到double類型的有限精度的限制,如果那是您使用的類型(您的問題是十進制,但您可能只是指帶有小數部分的浮點值而不是那個特定的類型)。

例如:

double n = 283.79;
n = System.Math.Ceiling (n * 100);

實際上會給你28380 ,而不是你期望的283.79 (a)

如果您想要全面准確的結果,您絕對應該使用decimal類型。


(a)這是因為283.79最准確的 IEEE754 雙精度表示實際上是:

 283.790000000000020463630789891

超出.79的額外(當然是微不足道的)小數部分會達到上限,這意味着它將為您提供比您預期更高的值。

            var numberToBeRound1 = 4.125;
            var numberToBeRound2 = 4.175;
            var numberToBeRound3 = 4.631;
            var numberToBeRound4 = 4.638;
            var numberOfDecimalPlaces = 2;
            var multiplier = Math.Pow(10, numberOfDecimalPlaces);

            //To Round Up => 4.13
            var roundedUpNumber = Math.Ceiling(numberToBeRound1 * multiplier) / multiplier;

            //To Round Down => 4.12
            var roundedDownNumber = Math.Floor(numberToBeRound1 * multiplier) / multiplier;

            //To Round To Even => 4.12
            var roundedDownToEvenNumber = Math.Round(numberToBeRound1, numberOfDecimalPlaces, MidpointRounding.ToEven);

            //To Round To Even => 4.18
            var roundedUpToEvenNumber = Math.Round(numberToBeRound2, numberOfDecimalPlaces, MidpointRounding.ToEven);

            //To Round To Away From Zero => 4.63
            var roundedDownToAwayFromZero = Math.Round(numberToBeRound3, numberOfDecimalPlaces, MidpointRounding.AwayFromZero);

            //To Round To Away From Zero => 4.64
            var roundedUpToAwayFromZero2 = Math.Round(numberToBeRound4, numberOfDecimalPlaces, MidpointRounding.AwayFromZero);

怎么樣

0.01 * ceil(100 * 189.182)
    public static decimal RoundUp(decimal input, int places)
    {
        decimal multiplier = (decimal)Math.Pow(10, places);
        return decimal.Ceiling(input * multiplier) / multiplier;
    }
   // Double will return the wrong value for some cases. eg: 160.80
    public static decimal  RoundUp(decimal input, int places)
    {
        decimal multiplier = Convert.ToDecimal(Math.Pow(10, Convert.ToDouble(places)));
        return Math.Ceiling(input * multiplier) / multiplier;
    }

在 .NET Core 3.0 及更高版本中,通過 MidpointRounding 枚舉提供了三種額外的舍入策略。 除了MidpointRounding.AwayFromZeroMidpointRounding.ToEven它現在還包括:

 1. MidpointRounding.ToNegativeInfinity
 2. MidpointRounding.ToPositiveInfinity
 3. MidpointRounding.ToZero

對於這個特定的問題,您需要使用MidpointRounding.ToPositiveInfinity ,這將始終向上舍入數字。 請注意,這僅在數字不是負數時才有效。 有關示例,請參見下表。

原號碼 ToNegativeInfinity ToPositiveInfinity 歸零
3.55 3.5 3.6 3.5
2.83 2.8 2.9 2.8
2.54 2.5 2.6 2.5
2.16 2.1 2.2 2.1
-2.16 -2.2 -2.1 -2.1
-2.54 -2.6 -2.5 -2.5
-2.83 -2.9 -2.8 -2.8
-3.55 -3.6 -3.5 -3.5

有關中點舍入的更多信息,請參閱https://docs.microsoft.com/en-us/dotnet/api/system.midpointrounding

當然還有使它工作的代碼:

// function explained: Math.Round(number, amount of decimals, MidpointRounding);
decimal number = 189.182m;
number =  Math.Round(number, 2, MidpointRounding.ToPositiveInfinity);
// result: number = 189.19

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM