2013-12-08 130 views
0

我正在做一个程序,得到的平均值,并且在阵列推算数字的标准偏差。然而,我只会遇到一件事:每当返回平均值和标准偏差时,它就会显示为不是数字。代码有什么问题?平均值和标准偏差方法返回的NaN的

这里的方法:

public mainFrame() { 
    initComponents(); 
} 

private double avg; 
private double stdDeviation; 
private double[] gradeArray; 

    /** 
    * 
    * @param gradeArray 
    * @param numElem 
    * @return 
    */ 
    public double getAverage (double[] gradeArray, int numElem) { 
    double sum = 0; 

    for(int i=0;i<numElem;i++){ 
     sum = sum + gradeArray[i]; 
    } 
    return (sum/numElem);   
} 

public double getStdDev (double[] gradeArray, int numElem, double avg){ 
    double sum = 0; 

    for(int i = 0;i<numElem;i++){ 
     sum = sum + Math.pow((gradeArray[i]-avg),2); 
    } 
    return Math.sqrt(sum/numElem); 

这里是事件代码时“输入级别”按钮被点击:

final int SIZE = 25; 
double[] gradeArray = new double[SIZE]; 
String s; 
int numElem = 0; 
double average = 0; 

for(int i=0;i<=SIZE;i++){ 

    s = (String)JOptionPane.showInputDialog("Enter Grade",""); 
    if (s == null || s == ("")){ 
     break; 

    } 
    else{ 
     try{ 
      gradeArray[i] = Double.parseDouble (s); 
      average = getAverage(gradeArray,numElem); 
      stdDeviation = getStdDev(gradeArray,numElem,avg); 
      txtGradeEntered.setText(1 + i + ""); 
      txtMean.setText(average +""); 
      txtStdDev.setText(stdDeviation+""); 

     } 
     catch (NumberFormatException e){ 
      JOptionPane.showMessageDialog(null, "Your input must be numeric!","Bad Data!",0); 
     } 
     catch (ArrayIndexOutOfBoundsException e){ 
      JOptionPane.showMessageDialog (null, "You can only input 25 values!","Too much data!",0); 
     } 


    } 
} 
+0

您是否尝试过使用调试器? –

+0

'numElem'从0开始。因此在'getAverage'中,你除以0。 –

回答

1

的问题是与这样的表述师:return (sum/numElem);哪里numElm初始化为0sum0,因为以下从未得到执行:

for(int i=0;i<numElem;i++){ //<---- numElem = 0 
     sum = sum + gradeArray[i]; 
    } 

A NaN值用于表示某些无效操作的结果,例如将 零除零。浮法和双重类型的NaN常数预定义为 Float.NaNDouble.NaN

所以初始化或设置此numElem为其他值。

相关问题