Java中Double类型计算异常:平均值结果为1.0而非1.8的问题求助
问题分析与解决建议
嗨,我看到你在大学项目里遇到了平均值计算的错误,咱们来快速定位并解决这个问题!
核心问题:整数除法导致精度丢失
你得到错误平均值的原因很简单——Java中的整数除法会自动舍去小数部分。
你的代码里,intSum和counter都是int类型:
double doubleAvg = 0; if (counter > 0) { doubleAvg = intSum / counter; }
当计算9 / 5时,因为两个都是整数,结果会被截断为1,之后再赋值给double类型的doubleAvg,就变成了1.0,而不是你期望的1.8。
解决方法:强制转换为浮点数除法
只需要把其中一个操作数强制转换为double,就能触发浮点数除法,保留小数部分:
double doubleAvg = 0; if (counter > 0) { // 将intSum转为double后再进行除法 doubleAvg = (double) intSum / counter; }
这样(double)9 /5就会得到1.8,赋值给doubleAvg后就是正确的结果。
额外的代码优化建议
除了平均值的问题,你的代码还有一些可以简化的地方:
- 初始化
intLargest和intSmallest的判断完全冗余,直接赋值即可:
因为如果第一个输入是intInput = sc.nextInt(); intLargest = intInput; intSmallest = intInput;0,循环不会执行,后续输出的最小/最大值就是0,符合逻辑;如果输入非0,直接用第一个值初始化最大最小值也没问题。 - 统计奇偶的
else if可以简化为else,因为一个数要么是偶数要么是奇数,不需要再判断一次:if ((intInput%2) == 0) { intEven++; } else { intOdd++; }
修正后的完整代码片段
这里是调整后的关键部分和完整输出代码:
public static void main(String[] args) { Scanner sc = new Scanner(System.in); int counter = 0; int intInput; int intLargest; int intSmallest; int intEven = 0; int intOdd = 0; int intSum = 0; String strMessage = "Enter a series of value (0 to quit)"; System.out.print(strMessage); System.out.println(); System.out.print("Enter Integer value?" + "\n"); intInput = sc.nextInt(); intLargest = intInput; intSmallest = intInput; while(intInput != 0) { if (intInput > intLargest) { intLargest = intInput; } else if (intInput < intSmallest) { intSmallest = intInput; } if ((intInput%2) == 0) { intEven++; } else { intOdd++; } intSum = intSum + intInput; intInput = sc.nextInt(); counter++; } double doubleAvg = 0; if (counter > 0) { doubleAvg = (double) intSum / counter; } System.out.println(); System.out.print("Smallest = " + intSmallest +"\n"); System.out.print("Largest = " + intLargest + "\n"); System.out.print("Total Entered = " + counter + "\n"); System.out.print("Even Number = " + intEven + "\n"); System.out.print("Odd Number = " + intOdd + "\n"); System.out.print("Average = " + doubleAvg + "\n"); System.out.print("SUM: " + intSum + "\n"); }
现在运行你的测试输入3 -4 5 12 -7 0,就能得到正确的平均值1.8啦!
内容的提问来源于stack exchange,提问作者Duke
相关产品推荐
相关产品推荐

