You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 误读分支编号:文本每行开头的1、2、3是分支编号,并非销售数据,但代码将其当作销售数值读取,直接导致年度总和多了1+2+3=6,与实际差值完全吻合。
  2. 季度分组逻辑错位:代码用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 21:05:57