2013-12-08 1 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); 

А вот код события, когда «Enter Сорта» кнопка нажата на:

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 инициализируется как 0 и sum также является 0, поскольку следующее никогда не выполняется:

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

A NaN Значение используется для представления результатов определенных недействительных операций, таких как деление на ноль. Константы NaN как поплавка, так и двойного типа предопределены как Float.NaN и Double.NaN.

Так инициализируйте или установите это numElem на другое значение.

Смежные вопросы