[英]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.AwayFromZero
和MidpointRounding.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.