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
相关产品推荐
相关产品推荐

