4

Dictionary を引数として受け取り、Dictionary を返すコードがあります。

このコードは、すべての double 値の合計を計算し、その合計を使用して各値が合計に占める割合を計算します。キーにパーセンテージが連結された新しい Dictionary を返します。

Web サーバーのイベント ビューアにいくつかの OverflowException が記録されています。ログには、次のコードで例外が発生したことが記録されていますDecimal percentage = (Decimal) (pDataPoints[key] / sum * 100); 。値を 10 進数にキャストするときに例外が発生したことが示されています。

どのようなエッジケースが欠落している可能性がありますか?

public static Dictionary<string, double> addPercentagesToDataPointLabels(Dictionary<string, double> pDataPoints)
{
Dictionary<string, double> valuesToReturn = new Dictionary<string, double>();

// First, compute the sum of the data point values
double sum = 0;
foreach (double d in pDataPoints.Values)
{
    sum += d;
}

// Now, compute the percentages using the sum and add them to the new labels.
foreach (string key in pDataPoints.Keys)
{
    string newKey = key;
    Decimal percentage = (Decimal) (pDataPoints[key] / sum * 100);
    percentage = Math.Round(percentage, ChartingValues.DIGITS_AFTER_DECIMAL_POINT);
    newKey += " " + percentage.ToString() + "%";
    valuesToReturn.Add(newKey, pDataPoints[key]);
}

return valuesToReturn;
}
4

4 に答える 4

6

どうぞ:

addPercentagesToDataPointLabels(new Dictionary<string, double>(){{"a", 0}});

gdoron が言ったように、0 で除算します。ただし、int に対してのみ例外がスローされます。浮動小数点数の場合、結果はDouble.Infinity. 次に、無限大を 10 進数に変換しようとします。

于 2012-05-02T15:50:17.780 に答える
1

a の最大値decimalは 79,228,162,514,264,337,593,543,950,335 です。a (入力値) の最大値doubleは 1.7976931348623157E+308 です。おそらく、入力値 (または少なくとも の結果pDataPoints[key] / sum * 100) の一部は、最大 10 進数値よりも大きな値になります。

于 2012-05-02T15:41:17.717 に答える
0

実際にはパーセンテージを計算しているだけなので、そのパーセンテージの計算が範囲外になる真の数値を思い付くのはかなり困難ですdecimal.MinValue < v < decimal.MaxValue

ただし、常にこのエラーを引き起こす値がありますdouble.NaN

このディクショナリをメソッドに渡す場合:

var d = new Dictionary<string,double>(){
            {"A",2},
            {"B",2}
        };

あなたは非常に正しく結果を得る:

Key:A 50% Value:2
Key:B 50% Value:2

ただし、これを次の入力に変更します。

var d = new Dictionary<string,double>(){
            {"A",double.NaN},
            {"B",2}
        };

結果は次のとおりです。

System.OverflowException:値が小数に対して大きすぎるか小さすぎました。

これはあなたのエッジケースでしょうか?入力ディクショナリを生成するものはすべて、を生成しますNaN

上記を実証するための実例はここにあります:http://rextester.com/RRQT60265

于 2012-05-02T15:55:56.450 に答える