Java运费与折扣计算器计算结果错误问题求助
问题分析与修复方案
我帮你梳理下代码里的几个关键问题,这就是为什么测试1件衬衫时结果不对的原因:
1. 括号结构混乱,导致逻辑顺序错误
看你代码里的这段:
if (shirts <=5) cost = (int) (shirts*24.95f + 8.00f); { if (shirts <=10) cost = (int) (shirts*24.95f + 5.00f); if (shirts >=11) cost = (int) (shirts*24.95f); System.out.print(cost); }
这里的{}是一个独立的代码块,不管shirts <=5是否成立,里面的两个if都会执行。当你输入1件时,执行完shirts<=5的分支后,马上又进入这个代码块,触发shirts<=10的条件,把之前计算的32.95(转int是32)覆盖成29.95(转int是29),这就是你得到29的直接原因。
2. 第一个if分支的计算逻辑完全错误
if (shirts <=2) { cost = (int) (shirt * cost ); }
cost初始值是0,这里用shirt * cost等于0,完全不符合“计算衬衫总价+运费”的逻辑,应该是shirt * shirts加上对应的运费才对。
3. 多个独立的if语句导致条件覆盖
你用了多个独立的if,而不是else if,这会让符合多个条件的情况(比如shirts=1同时满足<=2、<=5、<=10)依次执行所有符合的分支,最后一次的计算结果会覆盖之前的,完全打乱了你的折扣/运费规则。
4. 使用int存储总价丢失精度
cost定义为int,会把所有小数部分直接截断,比如24.95+8=32.95会变成32,这显然不符合实际的价格计算逻辑,应该用float或者double来存储。
修复后的代码
我按照你的需求(订单量对应不同运费/折扣)重新整理了逻辑,假设你的规则是:
- 购买1-2件:单价24.95,运费8.00
- 购买3-10件:单价24.95,运费5.00
- 购买11件及以上:单价24.95,免运费
如果你的折扣规则不同,可以自行调整条件里的计算方式,核心逻辑是对的:
import java.util.Scanner; public class ShirtOrderCalculator { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("Please enter the number of shirts ordered: "); int shirts = input.nextInt(); // 用double存储总价,避免精度丢失 double totalCost; final double SHIRT_PRICE = 24.95; // 使用else if确保只会执行符合条件的第一个分支 if (shirts <= 2) { totalCost = shirts * SHIRT_PRICE + 8.00; } else if (shirts <= 10) { totalCost = shirts * SHIRT_PRICE + 5.00; } else if (shirts >= 11) { totalCost = shirts * SHIRT_PRICE; } else { // 处理输入负数的情况 System.out.println("Invalid number of shirts!"); input.close(); return; } // 保留两位小数输出,符合价格格式 System.out.printf("Total cost: $%.2f%n", totalCost); input.close(); } }
修复点说明
- 用
else if替代多个独立if,确保每个订单量只会匹配一个规则分支 - 修正了第一个分支的计算逻辑,用
shirts * SHIRT_PRICE计算衬衫总价 - 把
cost改成double类型,保留价格的小数精度,最后用printf格式化输出两位小数 - 增加了输入负数的异常处理,让程序更健壮
- 用
final定义衬衫单价,方便后续修改维护
现在测试1件衬衫时,会得到Total cost: $32.95,符合24.95+8的计算结果;如果你的预期是24.95(比如免运费?),可以调整第一个分支的运费规则即可。
内容的提问来源于stack exchange,提问作者Patryk Sommer
相关产品推荐
相关产品推荐

