如何解决输出给我一个NaN,为什么? [完整]
我正在尝试通过方法传递数组列表,我想显示它。这是我的代码
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而不是平均分的计算结果,为什么呢?我该如何解决?
解决方法
dispArrayList(ArrayList<Float> 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,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,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 + ".");
}
}
,
如果读取的值不是有效的浮点数,则 Scanner#nextFloat()
可以返回NaN
。
一旦列表中只有一个NaN
值,所有值的总和也将是NaN
。
此外,您不会在arr
方法中的dispArrayList(ArrayList<Float> arr)
列表上循环,而是在空的ArrayList<Float> objGrades
上循环,因此以下行将求值为NaN
,因为除以零:
fltAverage = fltSum / objGrades.size();
// fltAverage = 0.0f / 0.0f
,
您没有使用ArrayList传递给dispArrayList方法。
在dispArrayList方法中删除此行ArrayList objGrades = new ArrayList();
并将此public static void dispArrayList(ArrayList arr)
更改为public static void dispArrayList(ArrayList objGrades)
基本上,您没有使用在方法dispArrayList(ArrayList arr)中传递的参数
然后除以零。
无需在显示方法中创建新的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,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 + ".");
}
,
我认为fltSum
和objGrades.size()
均为0。
ZERO / ZERO = NaN
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。