26

Math.Round と MidpointRounding を使用してみました。これは私が必要とすることをしていないようです。

例:

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

カスタム関数を作成する必要がありますか?

編集:

もっと具体的に言うべきでした。

23.56 に切り下げるために、23.567 のような数値が必要になることがあります。このシナリオでは...

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 は保持したい小数点以下の桁数です。

3 番目のパラメーターを渡すことで、.5 を切り上げるか切り下げるかを指定することもできます。

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

編集:

新しい要件 (つまり、次の間隔の「半分」よりも大きいにもかかわらず、数値が切り捨てられることがあります) に照らして、次のことを試すことができます。

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

Truncate() は、10 進数の整数以外の部分を削除します。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 に答える