如何在C#中向上或向下舍入?

B-R*_*Rad 22 c# math

我尝试过使用Math.Round和MidpointRounding.这似乎没有做我需要的.

例:

52.34567 rounded to 2 decimals UP   = 52.35  
 1.183   rounded to 2 decimals DOWN =  1.18
Run Code Online (Sandbox Code Playgroud)

我需要编写自定义函数吗?

编辑:

我应该更具体一点.

有时我需要像23.567这样的数字来向下舍入到23.56.在这种情况下......

Math.Round(dec, 2, MidpointRounding.AwayFromZero) gives 23.57
Math.Round(dec, 2, MidpointRounding.ToEven) gives 23.57
Run Code Online (Sandbox Code Playgroud)

可能会出现最多9位小数的小数,需要四舍五入到小数点后的1,2,3或甚至4位.

atk*_*sch 39

尝试使用decimal.Round():

decimal.Round(x, 2)
Run Code Online (Sandbox Code Playgroud)

x您的值在哪里,2是您希望保留的小数位数.

您还可以通过传递第三个参数来指定.5向上或向下舍入:

decimal.Round(x, 2, MidpointRounding.AwayFromZero);
Run Code Online (Sandbox Code Playgroud)

编辑:

根据新的要求(即,尽管数量大于下一个间隔的"中途",数字有时会向下舍入),您可以尝试:

var pow = Math.Pow(10, numDigits);
var truncated = Math.Truncate(x*pow) / pow;
Run Code Online (Sandbox Code Playgroud)

Truncate()会关闭小数的非整数部分.请注意,numDigits上面应该是您要保留的位数,而不是小数位总数等.

最后,如果你想强制向上舍入(截断实际上是强制向下舍入),你只需Truncate()在再次划分之前将1添加到调用结果中.


pas*_*ein 25

尝试使用Math.Ceiling(向上)或Math.Floor(向下).例如Math.Floor(1.8) == 1.

  • 这些都是很好的功能,然而,它们将价值强加给整数.在很多情况下我需要保持小数. (3认同)

Jef*_*f E 14

假设您使用的decimal是数字类型,

static class Rounding
{
    public static decimal RoundUp(decimal number, int places)
    {
        decimal factor = RoundFactor(places);
        number *= factor;
        number = Math.Ceiling(number);
        number /= factor;
        return number;
    }

    public static decimal RoundDown(decimal number, int places)
    {
        decimal factor = RoundFactor(places);
        number *= factor;
        number = Math.Floor(number);
        number /= factor;
        return number;
    }

    internal static decimal RoundFactor(int places)
    {
        decimal factor = 1m;

        if (places < 0)
        {
            places = -places;
            for (int i = 0; i < places; i++)
                factor /= 10m;
        }

        else
        {
            for (int i = 0; i < places; i++)
                factor *= 10m;
        }

        return factor;
    }
}
Run Code Online (Sandbox Code Playgroud)

例:

Rounding.RoundDown(23.567, 2) prints 23.56
Run Code Online (Sandbox Code Playgroud)


B-R*_*Rad 7

对于接受答案的较短版本,以下是可以使用的RoundUpRoundDown函数:

public double RoundDown(double number, int decimalPlaces)
{
    return Math.Floor(number * Math.Pow(10, decimalPlaces)) / Math.Pow(10, decimalPlaces);
}

public double RoundUp(double number, int decimalPlaces)
{
    return Math.Ceiling(number * Math.Pow(10, decimalPlaces)) / Math.Pow(10, decimalPlaces);
}
Run Code Online (Sandbox Code Playgroud)