【问题标题】:Java calculating doubles - NaNJava计算双打 - NaN
【发布时间】:2016-08-18 19:48:18
【问题描述】:

使用下面的代码,当输出到 GUI 中的标签时,变量(双精度)dAvgRun1、dAvgRun2(因此变量 dBest)返回为 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));

【问题讨论】:

  • 看起来你的循环真的很小。我会在dAvgRun1 的定义之后的第一个循环的开头放置一个断点,然后调试应用程序。但要获得 NaN,您可以将 0.0 除以 0.0。
  • 关于代码质量的旁注:您不仅可以构建双精度或整数数组。您还可以构建文本字段的数组(或更好的列表)。你知道,使用 12 个不同名称的文本字段来获取将存储在数组中的值有点疯狂。您重复代码 12 次,可以通过使用文本字段数组来大大压缩。
  • @Jägermeister 感谢您的提示。我试图让类似的东西与这个程序的前一个迭代一起工作,但我无法理解它。下次我需要做这样重复的事情时,我一定会记住这一点。
  • @RThomP 我只能推荐:永远不要重复代码。一旦你看到自己输入了你刚刚输入的东西;停在那里;并专注于寻找不需要重复代码的解决方案。

标签: java nan


【解决方案1】:

我认为问题出在此处:for (z=0; z&lt;daRun.length; z++)daRun.length 将返回 2 而不是您所期望的 7。

【讨论】:

    【解决方案2】:
    double [][] daRun = new double[2][7];
    

    你使用

    dAvgRun1 = dTotalRun1 / (daRun.length-2);
    

    它将执行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
    } 
    

    【讨论】:

    • 赢家鸡肉晚餐!谢谢@laune,通过确保我在以前只有 daRun.length 的地方使用了 daRun[0].length,问题就解决了!
    • 至于最大值或最小值的重复项,是的,过去曾发现这是有问题的,尽管这是一项大学任务(并且尚未指定这种情况)我会暂时保存我的努力。不过我很高兴你指出了这一点!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 2013-01-21
    • 2020-03-01
    • 2011-05-31
    • 1970-01-01
    • 2011-12-28
    相关资源
    最近更新 更多