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

Java收银程序Bug排查:单商品输入时低价商品统计错误

解决Java收银程序的计数错误及其他问题

我来帮你搞定这个问题!首先看你遇到的核心问题——当只输入一件商品就输入0终止时,程序总是统计1件低于500Ft的商品,这是因为你把终止输入的0当成了商品价格来判断。咱们一步步拆解问题,然后修复代码:

原代码的核心错误点

  • 错误1:终止输入的0被误判为商品:原代码进入for循环后先读取新的价格(也就是你输入的0),直接判断这个0是否小于500,导致无效的终止值被计入统计;同时第一个输入的有效商品价格完全没经过<500的判断,逻辑漏洞明显。
  • 错误2:平均值计算逻辑混乱:原代码里average = i;完全不符合逻辑,平均值应该是总金额除以商品数量,而非循环变量。
  • 错误3:变量名拼写错误:最后计算涨幅的语句里用了atlag(匈牙利语“平均”),但你定义的变量是average,会直接导致编译错误。
  • 错误4:商品数量统计不准确:循环变量i起始值为1,但第一个商品已经在循环外读取,后续计数会混乱。
  • 错误5:数据类型不合理:用int存储总金额可能会溢出,建议用double保持精度。

修复后的完整代码

import java.util.Scanner;

public class CashRegister {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        double totalAmount = 0.0; // 用double避免整数溢出,存储总金额
        double mostExpensive = 0.0;
        int itemsBelow500 = 0;
        int itemCount = 0; // 单独统计有效商品数量,逻辑更清晰

        System.out.println("Cash register program, please give prices, stops when 0 entered");

        while (true) {
            double price = sc.nextDouble();
            if (price == 0) {
                break; // 输入0直接终止,不参与任何商品统计
            }
            // 统计有效商品的各项数据
            itemCount++;
            totalAmount += price;
            if (price < 500) {
                itemsBelow500++;
            }
            if (price > mostExpensive) {
                mostExpensive = price;
            }
        }

        // 处理用户直接输入0的边界情况,避免除以0错误
        if (itemCount == 0) {
            System.out.println("No items entered.");
            sc.close();
            return;
        }

        double average = totalAmount / itemCount;
        // 优化涨幅计算公式,避免除法优先级问题,逻辑更直观
        double priceIncreasePercent = ((mostExpensive - average) / average) * 100;

        // 输出统计结果
        System.out.println("Total amount " + totalAmount + " Ft.");
        System.out.printf("Average is %.2f Ft.%n", average);
        System.out.println("Most expensive is " + mostExpensive + " Ft.");
        System.out.printf("The most expensive is %.2f%% more expensive than the average.%n", priceIncreasePercent);
        System.out.println("Totally " + itemsBelow500 + " pcs. cheaper than 500 FT.");

        sc.close();
    }
}

关键修复说明

  • 修正终止逻辑:用while循环替代for循环,输入0直接跳出循环,不会把终止值当成商品处理;所有有效商品(非0)都会经过完整的统计判断,包括第一个输入的商品。
  • 明确商品计数:用itemCount变量单独统计有效商品数量,避免循环变量带来的计数混乱。
  • 修复平均值与涨幅计算:平均值直接用总金额除以商品数量;涨幅公式优化为((最高价-均价)/均价)*100,逻辑更清晰,避免原代码的除法优先级陷阱。
  • 优化数据类型:总金额和价格用double类型,避免整数溢出问题,同时保持数值精度。
  • 增加边界处理:如果用户直接输入0,程序会提示无商品输入,避免出现除以0的运行时错误。

内容的提问来源于stack exchange,提问作者Tibor Tóth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:06:50