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

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();
    }
}

关键修正说明

  1. 精确货币计算:用BigDecimal替代double,彻底避免浮点运算的精度丢失问题,适合处理金额类计算
  2. 逻辑清晰区分:明确dailyPay存储当日薪资、totalPay存储累计薪资,表头与打印内容一一对应
  3. 循环逻辑修正:先累计当日薪资、打印数据,再将薪资翻倍,完全符合"第1天0.01美元,每日翻倍"的需求
  4. 规范格式输出:使用printf占位符替代字符串拼接,用%n适配不同系统的换行符,代码更健壮
  5. 资源清理:添加keyboard.close()关闭输入流,避免资源泄漏

内容的提问来源于stack exchange,提问作者TheBigDookie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 19:37:06