通过将值插入文本框来计算标准偏差。我有以下代码:
public decimal calcStd(List<int> ppValuesArray)
{
double std = 0;
if (ppValuesArray.Count() > 0)
{
double avg = ppValuesArray.Average();
double sum = ppValuesArray.Sum(d => Math.Pow(d - avg, 2));
std = Math.Sqrt((sum) / ppValuesArray.Count() - 1);
}
decimal stdDev = Convert.ToDecimal(std);
return (decimal)stdDev;
}
问题是当我多次输入相同的值时系统崩溃了。例如1,1,1,1会使它崩溃。
我收到了错误:
System.OverflowException:'对于十进制,值太大或太小。'
有什么想法吗?
答案 0 :(得分:1)
假设你在样本标准偏差之后,你错过了除数上-1的括号,即
std = Math.Sqrt((sum) / (ppValuesArray.Count() - 1));
您获得溢出的原因是decimal
无法表示双值NaN
,如果您尝试取平方根,则由Math.Sqrt(double)
返回负数。
另外,您将List<int>
作为输入的原因是什么? decimal
或double
似乎限制较少,具体取决于您使用的数据类型,例如
public static decimal calcStd(IEnumerable<double> ppValuesArray)
此外,假设尝试获取单个值的样本StdDev现在将产生DivideByZero
异常,则建议您将防护更改为:
if (ppValuesArray.Count() > 1)