在C#中舍入到2位小数

Chr*_*ris 22 c# math

我有一个十进制数字,可以像下面这样:

189.182

我想这一轮最多到小数点后2位,所以输出将是以下几点:

189.19

Math类中是否内置了此功能,还是其他功能?我知道天花板功能存在,但这似乎没有做我想要的 - 它会绕到最近的int,所以在这种情况下只是'189'.

Mik*_*ker 44

乘以100,呼叫上限,除以100,我认为你要求的

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

用法如下:

RoundUp(189.182, 2);
Run Code Online (Sandbox Code Playgroud)

这通过将小数点右移2个位置(因此它位于最后8位的右侧)然后执行上限操作,然后将小数点移回其原始位置来工作.

  • 此解决方案在技术上不正确.double值有一个尾数和一个指数,指数是2的基数,而不是10的基数10.将double乘以10或100不会简单地移动小数点.乘法后的结果具有不同的位模式.该结果可能不适合作为二进制数的全精度的尾数,并且可能最终被截断,在这种情况下,最后的有效位最终基于某些规则被舍入. (10认同)
  • 一个简单的情况,对于十进制https://dotnetfiddle.net/6IeRVG输入失败,这失败,输入283.79,输出283.8 (3认同)

pax*_*blo 18

您可以使用:

decimal n = 189.182M;
n = System.Math.Ceiling (n * 100) / 100;
Run Code Online (Sandbox Code Playgroud)

可以在此处找到各种舍入函数的说明.

  • 这应该是公认的答案,因为当前公认的答案没有解决重要的浮点精度问题。 (2认同)

Rao*_*oul 10

在 .NET Core 3.0 及更高版本中,可以通过 MidpointRounding 枚举使用三种附加舍入策略。此外MidpointRounding.AwayFromZeroMidpointRounding.ToEven它现在还包括:

 1. MidpointRounding.ToNegativeInfinity
 2. MidpointRounding.ToPositiveInfinity
 3. MidpointRounding.ToZero
Run Code Online (Sandbox Code Playgroud)

对于这个特定问题,您需要使用MidpointRounding.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://learn.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
Run Code Online (Sandbox Code Playgroud)


Fur*_*ürk 5

            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);
Run Code Online (Sandbox Code Playgroud)

  • `Math.Round(数字, 小数位数, MidpointRounding.AwayFromZero);` (2认同)