Java实现便士每日翻倍计算的代码问题求助
修正便士每日翻倍计算的Java代码
原代码存在的问题
- 混淆了当日薪资与累计薪资的显示逻辑:表头标注"Pennies",但实际打印的是累计总额,与需求不符
- 使用
double类型处理货币计算,会出现精度丢失(天数超过20天后误差明显) printf格式字符串写法不规范,存在硬编码拼接和错误换行符
修正后的代码
import java.math.BigDecimal; import java.util.Scanner; public class PennyDoublingPay { public static void main(String[] args) { int workedDays; BigDecimal dailyPay = new BigDecimal("0.01"); // 初始为第1天的当日薪资 BigDecimal totalPay = BigDecimal.ZERO; Scanner keyboard = new Scanner(System.in); // 获取工作天数 System.out.println("How many days have you worked?"); workedDays = keyboard.nextInt(); // 输入合法性验证 while (workedDays < 1) { System.out.println("Invalid input. Please enter a number no less than one."); workedDays = keyboard.nextInt(); } // 打印表头 System.out.println("Days\t\tDaily Pay\tTotal Pay"); System.out.println("------------------------------------------"); // 循环计算并打印每日数据 for (int day = 1; day <= workedDays; day++) { totalPay = totalPay.add(dailyPay); // 累计当日薪资到总额 // 格式化打印当日天数、当日薪资、累计薪资 System.out.printf("%d\t\t$%,.2f\t\t$%,.2f%n", day, dailyPay.doubleValue(), totalPay.doubleValue()); // 次日薪资翻倍 dailyPay = dailyPay.multiply(new BigDecimal("2")); } // 输出最终累计薪资 System.out.printf("%nYour Total Pay is:\t$%,.2f%n", totalPay.doubleValue()); keyboard.close(); } }
关键修正说明
- 精确货币计算:用
BigDecimal替代double,彻底避免浮点运算的精度丢失问题,适合处理金额类计算 - 逻辑清晰区分:明确
dailyPay存储当日薪资、totalPay存储累计薪资,表头与打印内容一一对应 - 循环逻辑修正:先累计当日薪资、打印数据,再将薪资翻倍,完全符合"第1天0.01美元,每日翻倍"的需求
- 规范格式输出:使用
printf占位符替代字符串拼接,用%n适配不同系统的换行符,代码更健壮 - 资源清理:添加
keyboard.close()关闭输入流,避免资源泄漏
内容的提问来源于stack exchange,提问作者TheBigDookie
相关产品推荐
相关产品推荐

