Java文件读取计算结果不符问题排查求助
Java销售数据求和计算结果不符问题
我按照教程编写了一段Java代码,使用File和Scanner类读取文本文件中的销售数据并进行年度、季度求和计算,但计算结果与手动计算值不符。
代码实现
public class Driver { public static void main(String[] args) throws Exception { Scanner scan = new Scanner(System.in); //what is this? System.out.println("Enter file name: "); String filename = scan.nextLine(); scan.close(); File myFile = new File(filename); scan = new Scanner(myFile); // yearly sum for all branches double yearlySum = 0; //quarterly sum for all branches //initialised to 0 by default double[] quarterlySum = new double[4]; //?? int count = 0; while(scan.hasNextDouble()) { double sales = scan.nextDouble(); yearlySum += sales; //quarterly 0, 1, 2 and 3 int quarter = count % 4; quarterlySum[quarter] += sales; count++; } scan.close(); System.out.println(yearlySum); for (int i = 0; i < 4; i++) { System.out.println(quarterlySum[i]); } } }
文本文件内容
1 1274.0 1585.0 1820.5 2038.4 2 1164.0 897.2 1432.8 3 987.4 1106.7 897.5 2137.2
实际控制台输出
15346.7 4369.7 3416.2 3736.4 3824.3999999999996
手动计算预期结果
- 年度总和
yearlySum应为15340.7,而非15346.7 - 季度数组各元素预期值分别为3425.4、3588.9、4150.8、4175.6,与实际输出差异明显
我尝试过将文本中无小数点的数字改为带.0的格式,但问题未解决,请问代码存在什么问题?
问题原因
- 误读分支编号:文本每行开头的
1、2、3是分支编号,并非销售数据,但代码将其当作销售数值读取,直接导致年度总和多了1+2+3=6,与实际差值完全吻合。 - 季度分组逻辑错位:代码用
count%4分配季度,但因为误读了分支编号,每个分支的第一个销售数据被分到了错误的季度,导致所有季度求和结果完全偏离预期。
解决办法
修改代码,跳过每行开头的分支编号,按行处理销售数据并对应到正确的季度:
import java.io.File; import java.util.Scanner; public class Driver { public static void main(String[] args) throws Exception { Scanner scan = new Scanner(System.in); System.out.println("Enter file name: "); String filename = scan.nextLine(); scan.close(); File myFile = new File(filename); scan = new Scanner(myFile); double yearlySum = 0; double[] quarterlySum = new double[4]; while (scan.hasNextLine()) { Scanner lineScanner = new Scanner(scan.nextLine()); if (lineScanner.hasNextInt()) { lineScanner.nextInt(); // 跳过分支编号 } // 按顺序将销售数据对应到Q1-Q4 int quarterIndex = 0; while (lineScanner.hasNextDouble() && quarterIndex < 4) { double sales = lineScanner.nextDouble(); yearlySum += sales; quarterlySum[quarterIndex] += sales; quarterIndex++; } lineScanner.close(); } scan.close(); // 格式化输出解决浮点数精度问题 System.out.printf("%.1f%n", yearlySum); for (double sum : quarterlySum) { System.out.printf("%.1f%n", sum); } } }
额外说明
输出中的3824.3999999999996是double浮点数的精度误差导致的,使用System.out.printf("%.1f", sum)格式化输出即可解决此问题。
内容的提问来源于stack exchange,提问作者JavaBeginner
相关产品推荐
相关产品推荐

