【问题标题】:Output giving me a NaN ,why? [ complete ]输出给我一个 NaN ,为什么? [ 完全的 ]
【发布时间】:2023-04-08 11:34:02
【问题描述】:

我试图通过一个方法传递一个数组列表,我想显示它。这是我的代码


        public static void dispArrayList(ArrayList<Float> arr) {
        
        ArrayList<Float> ssGrades = new ArrayList<Float>();
    
        float ss = 0, data = 0, sum = 0, avg = 0;
        
        for (int i= 0; i < ssGrade.size(); i++)
        {
            data = ssGrades.get(intIndex);
            sum += fltData;
            System.out.println(fdata);
        }  
        
        avg = sum/ ssGrades.size();
        System.out.println("\nAverage is " + avg+ ".");     
    }
}

问题是我的输出给出的是 NaN 而不是计算平均分,为什么会这样?我该如何解决?

【问题讨论】:

  • 您得到的确切输出(包括堆栈跟踪)是什么?
  • 它只是给我一个输出:平均值为 NaN

标签: java arraylist methods nan


【解决方案1】:

显示方法中无需创建新的ArrayList
改用传递的数组 arr
也永远不要像那样初始化一堆变量

 public static void main(String[] args)
{

    Scanner objDataEntry = new Scanner(System.in);

    ArrayList<Float> objGrades = new ArrayList<Float>();
    float fltGrade = 0, fltData = 0, fltSum = 0, fltAverage = 0;


    System.out.println("Enter a grade, -1 to exit..");
    while (fltGrade >= 0)
    {
        System.out.print("Grade: ");
        fltGrade = objDataEntry.nextFloat();

        if (fltGrade >= 0)
        {
            objGrades.add(fltGrade);
        }
    }
    dispArrayList(objGrades);
}


public static void dispArrayList(ArrayList<Float> arr) {
    float fltGrade = 0, fltData = 0, fltSum = 0, fltAverage = 0;
    
    System.out.println("\n\nGenerating grade listing");
    System.out.println("---------------------------");
    for (int intIndex = 0; intIndex < arr.size(); intIndex++)
    {
        fltData = arr.get(intIndex);
        fltSum += fltData;
        System.out.println(fltData);
    }

    fltAverage = fltSum / arr.size();
    System.out.println("\nAverage is " + fltAverage + ".");

}

另外,你有很多你不需要的无用变量
修改后的代码:

 public static void main(String[] args)
{

    Scanner objDataEntry = new Scanner(System.in);

    ArrayList<Float> objGrades = new ArrayList<Float>();
    float fltGrade = 0;


    System.out.println("Enter a grade, -1 to exit..");
    while (fltGrade >= 0)
    {
        System.out.print("Grade: ");
        fltGrade = objDataEntry.nextFloat();

        if (fltGrade >= 0)
        {
            objGrades.add(fltGrade);
        }
    }
    dispArrayList(objGrades);
}


public static void dispArrayList(ArrayList<Float> arr) {
    float fltSum = 0, fltAverage = 0;

    System.out.println("\n\nGenerating grade listing");
    System.out.println("---------------------------");
    for (int intIndex = 0; intIndex < arr.size(); intIndex++)
    {
        fltSum += arr.get(intIndex);
        System.out.println(arr.get(intIndex));
    }

    fltAverage = fltSum / arr.size();
    System.out.println("\nAverage is " + fltAverage + ".");

}

【讨论】:

    【解决方案2】:

    您没有使用 ArrayList 传递给 dispArrayList 方法。

    在 dispArrayList 方法中删除这一行 ArrayList objGrades = new ArrayList();

    把这个public static void dispArrayList(ArrayList arr)改成public static void dispArrayList(ArrayList objGrades)

    【讨论】:

      【解决方案3】:

      我认为fltSumobjGrades.size() 都是0。

      ZERO / ZERO = NaN
      

      您可以参考这个链接:https://www.baeldung.com/java-not-a-number

      【讨论】:

        【解决方案4】:

        基本上你没有使用方法dispArrayList(ArrayList arr)中传递的参数
        并除以零。

        【讨论】:

        • 可以的话给个赞吧
        【解决方案5】:

        如果读取的值不是有效的浮点数,Scanner#nextFloat() 可以返回 NaN

        一旦列表中有一个 NaN 值,所有值的总和也将是 NaN

        此外,您不会在 dispArrayList(ArrayList&lt;Float&gt; arr) 方法中循环遍历 arr 列表,而是遍历空的 ArrayList&lt;Float&gt; objGrades,因此以下行将计算为 NaN,因为除以零:

        fltAverage = fltSum / objGrades.size();
        // fltAverage = 0.0f / 0.0f
        

        【讨论】:

          【解决方案6】:

          dispArrayList(ArrayList&lt;Float&gt; arr) 方法中,而不是使用arr 数组参数,您定义了一个空的新数组并对其进行迭代,您必须按如下方式对其进行更改才能正常工作,其次我将强制转换添加到fltAverage = (float)fltSum / arr.size(); 的强制转换值浮动所以要精确。

          public static void dispArrayList(ArrayList<Float> arr) {
                  float fltGrade, fltData, fltSum, fltAverage;
                  fltGrade = fltData = fltSum = fltAverage = 0;
                  
                  System.out.println("\n\nGenerating grade listing");
                  System.out.println("---------------------------");
                  for (int intIndex = 0; intIndex < arr.size(); intIndex++) {
                      fltData = arr.get(intIndex);
                      fltSum += fltData;
                      System.out.println(fltData);
                  }
          
                  fltAverage = (float)fltSum / arr.size();
                  System.out.println("\nAverage is " + fltAverage + ".");
              }
          

          完整代码:

          import java.util.ArrayList;
          import java.util.Scanner;
          
          public class Grades {
          
              public static void main(String[] args) {
          
                  Scanner objDataEntry = new Scanner(System.in);
          
                  ArrayList<Float> objGrades = new ArrayList<Float>();
                  float fltGrade, fltData, fltSum, fltAverage;
                  fltGrade = fltData = fltSum = fltAverage = 0;
          
                  System.out.println("Enter a grade, -1 to exit..");
                  while (fltGrade >= 0) {
                      System.out.print("Grade: ");
                      fltGrade = objDataEntry.nextFloat();
          
                      if (fltGrade >= 0) {
                          objGrades.add(fltGrade);
                      }
                  }
                  dispArrayList(objGrades);
              }
          
              public static void dispArrayList(ArrayList<Float> arr) {
                  float fltGrade, fltData, fltSum, fltAverage;
                  fltGrade = fltData = fltSum = fltAverage = 0;
                  
                  System.out.println("\n\nGenerating grade listing");
                  System.out.println("---------------------------");
                  for (int intIndex = 0; intIndex < arr.size(); intIndex++) {
                      fltData = arr.get(intIndex);
                      fltSum += fltData;
                      System.out.println(fltData);
                  }
          
                  fltAverage = (float)fltSum / arr.size();
                  System.out.println("\nAverage is " + fltAverage + ".");
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-02-20
            • 1970-01-01
            • 1970-01-01
            • 2021-11-12
            • 2013-03-20
            • 1970-01-01
            • 2021-06-18
            相关资源
            最近更新 更多