计算百分比时抛出OverflowException
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算百分比时抛出OverflowException相关的知识,希望对你有一定的参考价值。
我有一些代码,它将一个参数作为一个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;
}
干得好:
addPercentagesToDataPointLabels(new Dictionary<string, double>(){{"a", 0}});
就像gdoron所说的那样,你除以0.但是它只为整数抛出异常。对于浮点数,它会产生Double.Infinity
。然后它尝试将无穷大转换为十进制。
pDataPoints[key] / sum * 100
此计算为您提供的结果太小或太大,无法以十进制形式存储。您可以捕获此异常并检查此表达式的值。我的建议(因为我无法分辨你期望的价值):
double percentageValue = pDataPoints[key] / sum * 100;
try
{
Decimal percentage = (Decimal) percentageValue;
}
catch (OverflowException exception)
{
//log percentageValue
throw;
}
decimal
的最大值是79,228,162,514,264,337,593,543,950,335。 double
(您的输入值)的最大值是1.7976931348623157E + 308。假设您的一些输入值(或至少是pDataPoints[key] / sum * 100
的结果)导致的值大于最大十进制值。
由于你实际上只计算一个百分比,很难得出一个真正的数字,使得该百分比计算超出范围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
以上是关于计算百分比时抛出OverflowException的主要内容,如果未能解决你的问题,请参考以下文章
Azure 机器学习在运行管道时抛出错误“无效图:节点中的计算目标无效”
C++:在计算大字符串的长度时抛出“std::bad_alloc”的实例后调用终止