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

如何简化Java欧元找零计算器中的多个while循环?

简化欧元找零计算器的重复代码

我第一次用Java编写欧元找零计算器,目前代码里有大量重复的while循环,希望简化代码的同时保留所有欧元币种的处理逻辑。代码中System.out.println(rgeldt + " mal 2 Euro");用于输出需要吐出2欧元硬币的次数,德语单词“geld”意为钱。

原代码

public static void Rueckgaberechner(Double geld) {
    System.out.println("Rueckgeld: ");
    int rgeldt = 0;
    while (geld >= 200) {
        geld = geld - 200;
        rgeldt = rgeldt + 1;
    }
    if (rgeldt >= 1) {
        System.out.println(rgeldt + " mal 2 Euro");
    }
    int rgeldO = 0;
    while (geld >= 100) {
        geld = geld - 100;
        rgeldO = rgeldO + 1;
    }
    if (rgeldO >= 1) {
        System.out.println(rgeldO + " mal 1 Euro");
    }
    int rgeldf = 0;
    while (geld >= 50) {
        geld = geld - 50;
        rgeldf = rgeldf + 1;
    }
    if (rgeldf >= 1) {
        System.out.println(rgeldf + " mal 50 Cent");
    }
    int rgeldtw = 0;
    while (geld >= 20) {
        geld = geld - 20;
        rgeldtw = rgeldtw + 1;
    }
    if (rgeldtw >= 1) {
        System.out.println(rgeldtw + " mal 20 Cent");
    }
    int rgeldten = 0;
    while (geld >= 10) {
        geld = geld - 10;
        rgeldten = rgeldten + 1;
    }
    if (rgeldten >= 1) {
        System.out.println(rgeldten + " mal 10 Cent");
    }
    int rgeldfive = 0;
    while (geld >= 5) {
        geld = geld - 5;
        rgeldfive = rgeldfive + 1;
    }
    if (rgeldfive >= 1) {
        System.out.println(rgeldfive + " mal 5 Cent");
    }
    int rgeldtwo = 0;
    while (geld >= 2) {
        geld = geld - 2;
        rgeldtwo = rgeldtwo + 1;
    }
    if (rgeldtwo >= 1) {
        System.out.println(rgeldtwo + " mal 2 Cent");
    }
    int rgeldone = 0;
    while (geld >= 1) {
        geld = geld - 1;
        rgeldone = rgeldone + 1;
    }
    if (rgeldone >= 1) {
        System.out.println(rgeldone + " mal 1 Cent");
    }
}

优化方案

核心思路是把所有欧元币种的面值和对应描述统一存储,通过遍历处理每个币种,同时解决原代码中Double的精度问题:

  1. 用数组集中存储所有币种的面值(以分为单位)和描述,后续调整币种只需修改数组
  2. 将输入金额转换为整数分,结合BigDecimal避免浮点运算的精度误差
  3. 用除法计算每个币种的数量,取余更新剩余金额,替代重复的while循环

优化后的代码

import java.math.BigDecimal;
import java.math.RoundingMode;

public class Rueckgaberechner {
    // 定义欧元币种:[面值(分), 显示描述]
    private static final int[][] EURO_DENOMINATIONS = {
        {200, "2 Euro"},
        {100, "1 Euro"},
        {50, "50 Cent"},
        {20, "20 Cent"},
        {10, "10 Cent"},
        {5, "5 Cent"},
        {2, "2 Cent"},
        {1, "1 Cent"}
    };

    public static void Rueckgaberechner(double geld) {
        System.out.println("Rueckgeld: ");
        // 转换为整数分,避免Double精度问题
        int cents = new BigDecimal(geld)
                .multiply(new BigDecimal(100))
                .setScale(0, RoundingMode.HALF_UP)
                .intValue();

        for (int[] denomination : EURO_DENOMINATIONS) {
            int value = denomination[0];
            String description = denomination[1];
            if (cents >= value) {
                int count = cents / value;
                System.out.println(count + " mal " + description);
                cents = cents % value;
            }
        }
    }
}

优化说明

  • 消除了重复的while循环和判断逻辑,代码更简洁易维护
  • 用整数处理金额,避免了Double类型在货币计算中常见的精度丢失问题
  • 币种信息集中管理,后续调整币种只需修改EURO_DENOMINATIONS数组即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:15:33