在C#中舍入到2位小数

时间:2011-08-16 08:04:07

标签: c# math

我有一个十进制数字,如下所示:

  

189.182

我想将此向上舍入到2位小数,因此输出如下:

  

189.19

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

6 个答案:

答案 0 :(得分:37)

乘以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位的右侧)然后执行上限操作,然后将小数点移回其原始位置。

答案 1 :(得分:13)

您可以使用:

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

可以找到各种舍入函数的解释here


请注意,这样的公式仍然受到double类型的有限精度的限制,如果您使用的类型(您的问题是十进制的,但您可能只是意味着一个浮点值)使用小数部分而不是特定的类型)。

例如:

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

实际上会给你28380,而不是你期望的283.79 (a)

如果您希望全面获得准确的结果,那么您肯定使用decimal类型。


(a)这是因为283.79的最准确的IEEE754双精度表示实际上是

 283.790000000000020463630789891

超出.79的额外(无可否认的微小)分数成分得到了提升,这意味着它会给你一个比你想象的更高的价值。

答案 2 :(得分:3)

怎么样

0.01 * ceil(100 * 189.182)

答案 3 :(得分:1)

            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);

答案 4 :(得分:0)

KeyError: ('List A', 'occurred at index ref')

答案 5 :(得分:0)

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