计算百分比时抛出OverflowException

问题描述 投票:4回答:4

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

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

我的Web服务器的事件查看器中记录了一些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;
}
c# exception overflow
4个回答
5
投票

干得好:

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

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


3
投票
pDataPoints[key] / sum * 100

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

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

1
投票

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


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:对于Decimal,值太大或太小。

这可能是你的优势吗?无论生成输入词典是什么产生NaN

您可以通过以下方式展示上述内容:qazxsw poi

© www.soinside.com 2019 - 2024. All rights reserved.