39

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

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

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

Math.Floor (41.75 * 0.1);
4

8 に答える 8

64

このMath.Round(...)関数には、使用する丸め戦略を示す列挙型があります。残念ながら、定義された2つはあなたの状況に正確には適合しません。

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

  1. AwayFromZero-数値が他の2つの数値の中間にある場合、ゼロから離れている最も近い数値に丸められます。(別名、切り上げ)
  2. ToEven-数値が他の2つの数値の中間にある場合、最も近い偶数に丸められます。(.17よりも.16、.17よりも.18を優先します)

使いたいのは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;
}
于 2012-11-23T01:29:29.817 に答える
16
public double RoundDown(double number, int decimalPlaces)
{
     return Math.Floor(number * Math.Pow(10, decimalPlaces)) / Math.Pow(10, decimalPlaces);
}
于 2013-10-29T01:46:09.657 に答える
11

現在.NET Core 3.0および今後.NET Framework 5.0の有効なもの

Math.Round(41.75 * 0.1, 2, MidpointRounding.ToZero)
于 2020-07-17T07:33:06.447 に答える
8

C#では高精度フロア/セイリンのネイティブサポートはありません。

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

例えば、

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

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

于 2012-11-23T01:38:36.213 に答える
1

もう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;
        }
    }
于 2012-11-27T00:03:32.200 に答える
0

これは私のフロートプルーフラウンドダウンです。

    public static class MyMath
{
    public static double RoundDown(double number, int decimalPlaces)
    {
        string pr = number.ToString();
        string[] parts = pr.Split('.');
        char[] decparts = parts[1].ToCharArray();
        parts[1] = "";
        for (int i = 0; i < decimalPlaces; i++)
        {
            parts[1] += decparts[i];
        }
        pr = string.Join(".", parts);
        return Convert.ToDouble(pr);
    }
}
于 2020-05-31T06:04:31.927 に答える
0

最良の方法は文字列を使用することです。数学のバイナリの気まぐれは、そうでなければ物事を間違える傾向があります。.Net5.0がこの事実を時代遅れにするのを待ちます。小数点以下の桁数は特殊なケースではありません。そのためにMath.Floorを使用できます。それ以外の場合は、必要な桁数よりも小数点以下1桁多い数値をToStringし、最後の桁なしで解析して答えを取得します。

/// <summary>
/// Truncates a Double to the given number of decimals without rounding
/// </summary>
/// <param name="D">The Double</param>
/// <param name="Precision">(optional) The number of Decimals</param>
/// <returns>The truncated number</returns>
public static double RoundDown(this double D, int Precision = 0)
{
  if (Precision <= 0) return Math.Floor(D);
  string S = D.ToString("0." + new string('0', Precision + 1));
  return double.Parse(S.Substring(0, S.Length - 1));
}
于 2020-10-17T22:22:29.203 に答える
0

ダブルを特定の小数点以下の桁数に切り捨てたい場合、中点であるかどうかに関係なく、次を使用できます。

    public double RoundDownDouble(double number, int decimaPlaces)
    {
        var tmp = Math.Pow(10, decimaPlaces);
        return Math.Truncate(number * tmp) / tmp;
    }
于 2021-03-26T22:28:20.493 に答える