26

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

例子:

52.34567 rounded to 2 decimals UP   = 52.35  
 1.183   rounded to 2 decimals DOWN =  1.18

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

编辑:

我应该更具体。

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

Math.Round(dec, 2, MidpointRounding.AwayFromZero) gives 23.57
Math.Round(dec, 2, MidpointRounding.ToEven) gives 23.57

最多可以输出小数点后 9 位的小数,需要四舍五入到小数点后 1、2、3 甚至 4 位。

4

9 回答 9

45

尝试使用 decimal.Round():

decimal.Round(x, 2)

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

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

decimal.Round(x, 2, MidpointRounding.AwayFromZero);

编辑:

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

var pow = Math.Pow(10, numDigits);
var truncated = Math.Truncate(x*pow) / pow;

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

最后,如果您想强制向上舍入(截断实际上是强制向下舍入),您只需在Truncate()调用结果上加 1,然后再除。

于 2012-11-20T21:10:23.000 回答
30

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

于 2012-11-20T21:29:08.707 回答
16

假设您使用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;
    }
}

例子:

Rounding.RoundDown(23.567, 2) prints 23.56
于 2012-11-20T22:06:11.570 回答
10

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

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);
}
于 2012-11-20T23:00:29.850 回答
1

带有结果的完整代码。

  double a = Math.Round(128.5, 0, MidpointRounding.AwayFromZero);

结果是129

于 2015-08-21T12:29:15.013 回答
1

该类Math为您提供了用于向上和向下舍入的方法,它们分别是Math.Ceiling()Math.Floor()。它们的工作方式类似Math.Round(),但它们有一个特殊性,它们只接收一个值并将它们四舍五入到整个部分。

因此,您需要Math.Pow()将该值乘以 10 到您需要四舍五入的 n 小单位,然后您需要除以相同的乘积值。

请务必注意,该Math.Pow()方法的输入参数是double,因此您需要将它们转换为double.

例如:

当您要将值四舍五入为小数点后 3 位时(假设值类型为decimal):

double decimalsNumber = 3;
decimal valueToRound = 1.1835675M;
// powerOfTen must be equal to 10^3 or 1000.
double powerOfTen = Math.Pow(10, decimalsNumber);
// rounded must be equal to Math.Ceiling(1.1835675 * 1000) / 1000
decimal rounded = Math.Ceiling(valueToRound * (decimal)powerOfTen) / (decimal)powerOfTen;


Result: rounded = 1.184

当您要将值向下舍入到小数点后 3 位时(假设值类型为decimal):

double decimalsNumber = 3;
decimal valueToRound = 1.1835675M;
// powerOfTen must be equal to 10^3 or 1000.
double powerOfTen = Math.Pow(10, decimalsNumber);
// rounded must be equal to Math.Floor(1.1835675 * 1000) / 1000
decimal rounded = Math.Floor(valueToRound * (decimal)powerOfTen) / (decimal)powerOfTen;


Result: rounded = 1.183

To reference how to use them more specificaly and to get more information and about both methods you can see these pages from the oficial MSDN Microsoft site:

Math Class

Math.Pow Method (Double, Double)

Math.Floor Method (Decimal)

Math.Floor Method (Double)

Math.Ceiling Method (Decimal)

Math.Ceiling Method (Double)

于 2018-04-23T03:06:08.733 回答
0

也许这个?

Math.Round(dec + 0.5m, MidpointRounding.AwayFromZero);
于 2014-07-21T13:58:28.183 回答
0

试试这个自定义舍入

public int Round(double value)
{
    double decimalpoints = Math.Abs(value - Math.Floor(value));
    if (decimalpoints > 0.5)
        return (int)Math.Round(value);
    else
        return (int)Math.Floor(value);
}
于 2016-04-20T04:36:58.787 回答
0

You can achieve that by using the Method of Math.Round() or decimal.Round()-:

Math.Round(amt)
Math.Round(amt, Int32) and other overloading methods.


decimal.Round(amt)
decimal.Round(amt, 2) and other overloding methods.
于 2019-10-22T07:21:18.997 回答