web-dev-qa-db-ja.com

C#で小数点以下2桁に切り捨て

2つの小数を乗算し、結果を小数点以下2桁に切り捨てるにはどうすればよいですか?

たとえば、方程式が41.75 x 0.1の場合、結果は4.175になります。これを10進数のc#で実行すると、自動的に4.18に切り上げられます。 4.17に切り下げたいと思います。

Math.Floorを使用してみましたが、4.00に切り捨てられました。次に例を示します。

Math.Floor (41.75 * 0.1);
27
startupsmith

Math.Round(...)関数には、使用する丸め戦略を伝えるEnumがあります。残念ながら、定義された2つはあなたの状況に完全には適合しません。

2つの中点丸めモードは次のとおりです。

  1. AwayFromZero-数値が2つの中間にある場合、ゼロから離れた最も近い数値に向かって丸められます。 (赤、切り上げ)
  2. ToEven-数値が他の2つの中間にある場合、最も近い偶数に向かって丸められます。 (.17以上.16以上、.18以上.17以上)

使用したいのは、Floorと乗算です。

var output = Math.Floor((41.75 * 0.1) * 100) / 100;

output変数には4.17が含まれているはずです。

実際、可変長をとる関数を書くこともできます:

public decimal RoundDown(decimal i, double decimalPlaces)
{
   var power = Convert.ToDecimal(Math.Pow(10, decimalPlaces));
   return Math.Floor(i * power) / power;
}
38
Aren
public double RoundDown(double number, int decimalPlaces)
{
     return Math.Floor(number * Math.Pow(10, decimalPlaces)) / Math.Pow(10, decimalPlaces);
}
11

C#では、精度の高いfloor/ceillinのネイティブサポートはありません。

ただし、数、フロアを乗算してから同じ乗数で除算することにより、機能を模倣できます。

例えば、

decimal y = 4.314M;
decimal x = Math.Floor(y * 100) / 100;  // To two decimal places (use 1000 for 3 etc)
Console.WriteLine(x);  // 4.31

理想的な解決策ではありませんが、数が少ない場合は機能するはずです。

5
Kami

もう1つの解決策は、ゼロからの丸めからゼロへの丸めを行うことです。次のようになります。

    static decimal DecimalTowardZero(decimal value, int decimals)
    {
        // rounding away from zero
        var rounded = decimal.Round(value, decimals, MidpointRounding.AwayFromZero);

        // if the absolute rounded result is greater 
        // than the absolute source number we need to correct result
        if (Math.Abs(rounded) > Math.Abs(value))
        {
            return rounded - new decimal(1, 0, 0, value < 0, (byte)decimals);
        }
        else
        {
            return rounded;
        }
    }
1
SLenik