2

小数のリストを小数点以下 2 桁にフォーマットし、合計を 100.00 にする方法を教えてください。

    static void Main(string[] args)
    {
        string decimalFormat = "0.00";
        decimal[] individuals = { 10, 10, 10 };
        decimal total = 30;
        List<decimal> percents = new List<decimal>();
        foreach (decimal t in individuals)
        {
            decimal percent = (t * 100) / total;
            percents.Add(percent);
        }

        List<decimal> roundToTwoDecimalPercent = new List<decimal>();
        foreach (decimal portfolio in percents)
        {
            roundToTwoDecimalPercent.Add(Math.Round(portfolio, 2));
        }

        decimal percentTotal = decimal.Zero;
        foreach (decimal final in roundToTwoDecimalPercent)
        {
            percentTotal += final;
        }

        Console.WriteLine(percentTotal.ToString(decimalFormat)); // 99.99 but the EXPECTED OUTPUT IS 100.00
        Console.ReadLine();
    }

ありがとう、S.Venkatesh

4

1 に答える 1

5

基本的、

四捨五入された数値の合計は、同じ数値の四捨五入された合計と必ずしも同じではありません。

最後に 1 回だけラウンドする必要があります。

これにより、期待される出力が得られます。

static void Main(string[] args)
{
    string decimalFormat = "0.00";
    decimal[] individuals = { 10, 10, 10 };
    decimal total = 30;
    List<decimal> percents = new List<decimal>();
    foreach (decimal t in individuals)
    {
        decimal percent = (t * 100) / total;
        percents.Add(percent);
    }

    decimal percentTotal = decimal.Zero;
    foreach (decimal percent in percents)
    {
        percentTotal += percent;
    }

    Console.WriteLine(string.Format("{0:N2}", percentTotal)); 
    Console.ReadLine();
}

または:あなたが私のような LINQ ファンなら、これは同じ結果をもたらします:

static void Main(string[] args)
{
    decimal[] individuals = { 10, 10, 10 };

    decimal total = individuals.Sum();

    decimal[] percentages = individuals.Select(i => i * 100 / total).ToArray();

    decimal percentageTotal = percentages.Sum();

    Console.WriteLine(string.Format("{0:N2}", percentageTotal));

    Console.ReadLine();
}

追加の例: 次のテスト アプリを使用します。

static void Main(string[] args)
{
    decimal[] individuals = { 10, 10, 10 };

    Console.WriteLine("Unrounded figures");

    var percentages = individuals.Select(i => i * 100 / individuals.Sum()).ToList();

    percentages.ForEach(p => Console.WriteLine(p.ToString()));

    decimal percentageTotal = percentages.Sum();
    Console.WriteLine("Their unrounded sum = {0}", percentageTotal);
    Console.WriteLine("Their rounded sum = {0:N2}", percentageTotal);

    Console.WriteLine();
    Console.WriteLine("Rounded figures");

    var roundedPercentages = individuals.Select(i => Math.Round(i * 100 / individuals.Sum(), 2)).ToList();
    roundedPercentages.ForEach(p => Console.WriteLine(p.ToString()));

    decimal roundedPercentageTotal = roundedPercentages.Sum();

    Console.WriteLine("Their unrounded sum = {0}", roundedPercentageTotal);
    Console.WriteLine("Their rounded sum = {0:N2}", roundedPercentageTotal);

    Console.ReadLine();
}

次の出力が得られます。

出力

于 2012-07-25T07:20:31.070 に答える