如何简化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的精度问题:
- 用数组集中存储所有币种的面值(以分为单位)和描述,后续调整币种只需修改数组
- 将输入金额转换为整数分,结合
BigDecimal避免浮点运算的精度误差 - 用除法计算每个币种的数量,取余更新剩余金额,替代重复的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
相关产品推荐
相关产品推荐

