计算百分比时抛出OverflowException

时间:2012-05-02 15:37:10

标签: c# exception overflow

我有一个代码,它将一个参数作为一个Dictionary并返回一个Dictionary。

代码计算所有double值的总和,并使用sum计算每个值与总和的百分比。它返回一个新的Dictionary,其百分比连接到键上。

我的网络服务器的事件查看器中记录了一些OverflowExceptions。日志记录了以下代码Decimal percentage = (Decimal) (pDataPoints[key] / sum * 100);上发生异常的情况。它表示将值转换为小数时会发生异常。

我可以遗漏哪些优势?

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 个答案:

答案 0 :(得分:5)

你走了:

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

就像gdoron所说的那样,除以0.但它仅针对整数抛出异常。对于浮点数,它会产生Double.Infinity。然后它尝试将无穷大转换为十进制。

答案 1 :(得分:3)

pDataPoints[key] / sum * 100

此计算为您提供的结果太小或太大,无法以十进制形式存储。您可以捕获此异常并检查此表达式的值。 我的建议(因为我无法分辨你期望的价值):

double percentageValue = pDataPoints[key] / sum * 100;
try
{
    Decimal percentage = (Decimal) percentageValue;
}
catch (OverflowException exception)
{
    //log percentageValue
    throw;
}

答案 2 :(得分:1)

decimal的最大值为79,228,162,514,264,337,593,543,950,335。 double(您的输入值)的最大值是1.7976931348623157E + 308。假设您的一些输入值(或至少是pDataPoints[key] / sum * 100的结果)导致的值大于最大十进制值。

答案 3 :(得分: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