在计算十进制标准偏差期间获得OverflowException

时间:2017-11-28 18:16:49

标签: c# .net visual-studio standard-deviation

通过将值插入文本框来计算标准偏差。我有以下代码:

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:'对于十进制,值太大或太小。'

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

假设你在样本标准偏差之后,你错过了除数上-1的括号,即

std = Math.Sqrt((sum) / (ppValuesArray.Count() - 1));

您获得溢出的原因是decimal无法表示双值NaN,如果您尝试取平方根,则由Math.Sqrt(double)返回负数。

另外,您将List<int>作为输入的原因是什么? decimaldouble似乎限制较少,具体取决于您使用的数据类型,例如

 public static decimal calcStd(IEnumerable<double> ppValuesArray)

此外,假设尝试获取单个值的样本StdDev现在将产生DivideByZero异常,则建议您将防护更改为:

if (ppValuesArray.Count() > 1)