Java计算double-NaN

Java计算double-NaN,java,nan,Java,Nan,在下面的代码中,变量(double)dAvgRun1、dAvgRun2(因此变量dBest)在输出到GUI中的标签时返回为NaN 我在代码中犯了什么错误使我的双打成为NaN double [][] daRun = new double[2][7]; //Sets Athlete Name and Nationality labels to selected athlete in JList jLabel_Athlete.s

在下面的代码中,变量(double)dAvgRun1、dAvgRun2(因此变量dBest)在输出到GUI中的标签时返回为NaN

我在代码中犯了什么错误使我的双打成为NaN

            double [][] daRun = new double[2][7];

            //Sets Athlete Name and Nationality labels to selected athlete in JList
            jLabel_Athlete.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).sName);
            jLabel_Country.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).sCountry);

            //Returns all scores for selected athlete
            jTextField_Run1_0.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun1[0]);
            jTextField_Run1_1.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun1[1]);
            jTextField_Run1_2.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun1[2]);
            jTextField_Run1_3.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun1[3]);
            jTextField_Run1_4.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun1[4]);
            jTextField_Run1_5.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun1[5]);
            jTextField_Run1_6.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun1[6]);

            jTextField_Run2_0.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun2[0]);
            jTextField_Run2_1.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun2[1]);
            jTextField_Run2_2.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun2[2]);
            jTextField_Run2_3.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun2[3]);
            jTextField_Run2_4.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun2[4]);
            jTextField_Run2_5.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun2[5]);
            jTextField_Run2_6.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun2[6]);

            //Parse all scores from string to double
            daRun[0][0] = Double.parseDouble(jTextField_Run1_0.getText());
            daRun[0][1] = Double.parseDouble(jTextField_Run1_1.getText());
            daRun[0][2] = Double.parseDouble(jTextField_Run1_2.getText());
            daRun[0][3] = Double.parseDouble(jTextField_Run1_3.getText());
            daRun[0][4] = Double.parseDouble(jTextField_Run1_4.getText());
            daRun[0][5] = Double.parseDouble(jTextField_Run1_5.getText());
            daRun[0][6] = Double.parseDouble(jTextField_Run1_6.getText());

            daRun[1][0] = Double.parseDouble(jTextField_Run2_0.getText());
            daRun[1][1] = Double.parseDouble(jTextField_Run2_1.getText());
            daRun[1][2] = Double.parseDouble(jTextField_Run2_2.getText());
            daRun[1][3] = Double.parseDouble(jTextField_Run2_3.getText());
            daRun[1][4] = Double.parseDouble(jTextField_Run2_4.getText());
            daRun[1][5] = Double.parseDouble(jTextField_Run2_5.getText());
            daRun[1][6] = Double.parseDouble(jTextField_Run2_6.getText());

            //Finds maximum and minimum scores for both runs
            int z;
            double dMinScoreRun1 = 10, dMaxScoreRun1 = 0;
            double dMinScoreRun2 = 10, dMaxScoreRun2 = 0;

            for (z=0; z<daRun.length; z++)
            {
                if (daRun[0][z] > dMaxScoreRun1)
                {dMaxScoreRun1 = daRun[0][z];}
                if (daRun[0][z] < dMinScoreRun1)
                {dMinScoreRun1 = daRun[0][z];}

                if (daRun[1][z] > dMaxScoreRun2)
                {dMaxScoreRun2 = daRun[1][z];}
                if (daRun[1][z] < dMinScoreRun2)
                {dMinScoreRun2 = daRun[1][z];}
            }


            //Calculates average scores
            double dTotalRun1 = 0, dTotalRun2 = 0;
            double dAvgRun1 = 0, dAvgRun2 = 0;

            //Run 1
            for (z=0; z<daRun.length; z++)
            {
                if(daRun[0][z] == dMaxScoreRun1 || daRun[0][z] == dMinScoreRun1)
                    continue;
                dTotalRun1 += daRun[0][z];
            }
            dAvgRun1 = dTotalRun1 / (daRun.length-2);

            //Run 2
            for (z=0; z<daRun.length; z++)
            {
                if(daRun[1][z] == dMaxScoreRun2 || daRun[1][z] == dMinScoreRun2)
                    continue;
                dTotalRun2 += daRun[1][z];
            }
            dAvgRun2 = dTotalRun2 / (daRun.length-2);

            //Displays averages for both runs
            jLabel_Average1.setText(Double.toString(dAvgRun1));
            jLabel_Average2.setText(Double.toString(dAvgRun2));

            //Compare both scores to find the best score.
            double dBest = dAvgRun1;

            if (dAvgRun2 > dAvgRun1)
            {
                dBest = dAvgRun2;
            }

            //Sets text of lblBestScore to the highest of the two scores 
            jLabel_Best.setText(Double.toString(dBest));
double[]daRun=new double[2][7];
//将运动员姓名和国籍标签设置为JList中选定的运动员
jLabel\u athletator.setText(vecathletator.get(jList\u athletator.getSelectedIndex()).sName);
jLabel\u Country.setText(vecAthletor.get(jList\u athleter.getSelectedIndex()).scontry);
//返回所选运动员的所有分数
jTextField_Run1_0.setText(veccattern.get(jList_attern.getSelectedIndex()).saTempRun1[0]);
jTextField_Run1_1.setText(veccattern.get(jList_attern.getSelectedIndex()).saTempRun1[1]);
jTextField_Run1_2.setText(veccattern.get(jList_attern.getSelectedIndex()).saTempRun1[2]);
jTextField_Run1_3.setText(veccattern.get(jList_attern.getSelectedIndex()).saTempRun1[3]);
jTextField_Run1_4.setText(veccattern.get(jList_attern.getSelectedIndex()).saTempRun1[4]);
jTextField_Run1_5.setText(veccattern.get(jList_attern.getSelectedIndex()).saTempRun1[5]);
jTextField_Run1_6.setText(veccattern.get(jList_attern.getSelectedIndex()).saTempRun1[6]);
jTextField_Run2_0.setText(veccattern.get(jList_attern.getSelectedIndex()).saTempRun2[0]);
jTextField_Run2_1.setText(veccattern.get(jList_attern.getSelectedIndex()).saTempRun2[1]);
jTextField_Run2_2.setText(veccattern.get(jList_attern.getSelectedIndex()).saTempRun2[2]);
jTextField_Run2_3.setText(veccattern.get(jList_attern.getSelectedIndex()).saTempRun2[3]);
jTextField_Run2_4.setText(veccattern.get(jList_attern.getSelectedIndex()).saTempRun2[4]);
jTextField_Run2_5.setText(veccattern.get(jList_attern.getSelectedIndex()).saTempRun2[5]);
jTextField_Run2_6.setText(veccattern.get(jList_attern.getSelectedIndex()).saTempRun2[6]);
//将所有分数从字符串解析为双精度
daRun[0][0]=Double.parseDouble(jTextField_Run1_0.getText());
daRun[0][1]=Double.parseDouble(jTextField_Run1_1.getText());
daRun[0][2]=Double.parseDouble(jTextField_Run1_2.getText());
daRun[0][3]=Double.parseDouble(jTextField_Run1_3.getText());
daRun[0][4]=Double.parseDouble(jTextField_Run1_4.getText());
daRun[0][5]=Double.parseDouble(jTextField_Run1_5.getText());
daRun[0][6]=Double.parseDouble(jTextField_Run1_6.getText());
daRun[1][0]=Double.parseDouble(jTextField_Run2_0.getText());
daRun[1][1]=Double.parseDouble(jTextField_Run2_1.getText());
daRun[1][2]=Double.parseDouble(jTextField_Run2_2.getText());
daRun[1][3]=Double.parseDouble(jTextField_Run2_3.getText());
daRun[1][4]=Double.parseDouble(jTextField_Run2_4.getText());
daRun[1][5]=Double.parseDouble(jTextField_Run2_5.getText());
daRun[1][6]=Double.parseDouble(jTextField_Run2_6.getText());
//查找两次运行的最高和最低分数
intz;
双dMinScoreRun1=10,dMaxScoreRun1=0;
双dMinScoreRun2=10,dMaxScoreRun2=0;
对于(z=0;z dMaxScoreRun1)
{dMaxScoreRun1=daRun[0][z];}
if(daRun[0][z]dMaxScoreRun2)
{dMaxScoreRun2=daRun[1][z];}
if(daRun[1][z]
dAvgRun1 = dTotalRun1 / (daRun.length-2);
whic将执行
dTotalRun1/0
。您可能需要

dAvgRun1 = dTotalRun1 / (daRun[0].length-2);
但这也有问题。如果有多个值等于最小值或最大值,该怎么办?您应该计算:

int cnt = 0;
for (z=0; z<daRun.length; z++){
    if(daRun[0][z] == dMaxScoreRun1 || daRun[0][z] == dMinScoreRun1)
          continue;
    dTotalRun1 += daRun[0][z];
    cnt++;
}

if( cnt != 0 ){
    dAvgRun1 = dTotalRun1 / cnt;
} else {
    // ? not sure what to use here
} 
int cnt=0;

对于(z=0;z我认为问题在于:
对于(z=0;z像您的循环这样的循环非常小。在定义了
dAvgRun1
之后,我会在您的第一个循环的开头放一个断点,然后调试应用程序。但是要得到NaN,您可以将0.0除以0.0。关于代码质量的旁注:您不仅可以构建双精度数组或整数数组。您还可以构建数组(或更好的列表)文本字段。你知道,使用12个具有不同名称的文本字段来获取将存储在数组中的值有点疯狂。你重复了12次代码,使用文本字段数组可以大大压缩代码。@Jägermeister谢谢你的提示。我正试着用类似的方法来处理以前的这个程序的迭代,但我无法理解。下次我需要做类似重复的事情时,我一定会记住这一点。@r我只能建议:永远不要重复代码。一旦你看到自己键入了之前键入的内容,就停下来,集中精力寻找一个不需要重复的解决方案te代码。Winner Winner鸡肉晚餐!感谢@laune,确保我使用了daRun[0]。长度以前只有daRun.length的地方,问题已经解决了!对于重复的最大值或最小值,是的,这在过去被认为是有问题的,尽管这是一项大学任务(并且尚未指定这种情况)我现在就省省我的努力。不过我很高兴你指出了这一点!
int cnt = 0;
for (z=0; z<daRun.length; z++){
    if(daRun[0][z] == dMaxScoreRun1 || daRun[0][z] == dMinScoreRun1)
          continue;
    dTotalRun1 += daRun[0][z];
    cnt++;
}

if( cnt != 0 ){
    dAvgRun1 = dTotalRun1 / cnt;
} else {
    // ? not sure what to use here
}