我有一个代码,它将一个参数作为一个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;
}
答案 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