
本文旨在帮助Java初学者优化其找零计算代码,通过使用除法和取模运算,避免冗长的while循环,从而提高代码效率和可读性。我们将提供详细的代码示例和解释,帮助读者理解并掌握这种更简洁的实现方式。
原代码使用多个while循环来计算每种面额的硬币数量,这使得代码冗长且不易维护。更优的解决方案是使用除法和取模运算符,可以直接计算出每种面额的数量,并更新剩余金额。
以下是使用除法和取模运算优化后的 Rueckgaberechner 方法:
public class ChangeCalculator {
public static void rueckgaberechner(double geld) {
System.out.println("Rueckgeld: ");
// 将金额转换为分(整数)
int geldInCent = (int) (geld * 100);
// 计算2欧元硬币的数量
int numberOf2Euros = geldInCent / 200;
geldInCent %= 200;
if (numberOf2Euros > 0) {
System.out.println(numberOf2Euros + " mal 2 Euro");
}
// 计算1欧元硬币的数量
int numberOf1Euros = geldInCent / 100;
geldInCent %= 100;
if (numberOf1Euros > 0) {
System.out.println(numberOf1Euros + " mal 1 Euro");
}
// 计算50分硬币的数量
int numberOf50Cents = geldInCent / 50;
geldInCent %= 50;
if (numberOf50Cents > 0) {
System.out.println(numberOf50Cents + " mal 50 Cent");
}
// 计算20分硬币的数量
int numberOf20Cents = geldInCent / 20;
geldInCent %= 20;
if (numberOf20Cents > 0) {
System.out.println(numberOf20Cents + " mal 20 Cent");
}
// 计算10分硬币的数量
int numberOf10Cents = geldInCent / 10;
geldInCent %= 10;
if (numberOf10Cents > 0) {
System.out.println(numberOf10Cents + " mal 10 Cent");
}
// 计算5分硬币的数量
int numberOf5Cents = geldInCent / 5;
geldInCent %= 5;
if (numberOf5Cents > 0) {
System.out.println(numberOf5Cents + " mal 5 Cent");
}
// 计算2分硬币的数量
int numberOf2Cents = geldInCent / 2;
geldInCent %= 2;
if (numberOf2Cents > 0) {
System.out.println(numberOf2Cents + " mal 2 Cent");
}
// 计算1分硬币的数量
int numberOf1Cents = geldInCent; // 剩余的都是1分
if (numberOf1Cents > 0) {
System.out.println(numberOf1Cents + " mal 1 Cent");
}
}
public static void main(String[] args) {
rueckgaberechner(3.88); // 测试用例
}
}代码解释:
立即学习“Java免费学习笔记(深入)”;
为了使代码更具可扩展性和可读性,可以使用枚举类型来表示不同的欧元面额,并使用 Map 来存储每种面额的数量。
import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Function;
import java.util.stream.Collectors;
public class ChangeCalculator {
enum EuroDenominations {
ONE_CENT_COIN(1, "1¢"),
TWO_CENT_COIN(2, "2¢"),
FIVE_CENT_COIN(5, "5¢"),
TEN_CENT_COIN(10, "10¢"),
TWENTY_CENT_COIN(20, "20¢"),
FIFTY_CENT_COIN(50, "50¢"),
ONE_EURO_COIN(100, "€1"),
TWO_EURO_COIN(200, "€2");
private final int cents;
private final String symbol;
EuroDenominations(int cents, String symbol) {
this.cents = cents;
this.symbol = symbol;
}
public int cents() {
return cents;
}
public String symbol() {
return symbol;
}
}
public static Map<EuroDenominations, Integer> rueckgaberechner(double geld) {
AtomicReference<Double> atomicGeld = new AtomicReference<>(geld);
return Arrays.stream(EuroDenominations.values())
.sorted(Comparator.comparing(EuroDenominations::cents).reversed())
.collect(Collectors.toMap(Function.identity(), v -> {
double g = atomicGeld.get();
int i = (int) (g / v.cents());
atomicGeld.set(g % v.cents());
return i;
},
(a, b) -> a,
LinkedHashMap::new));
}
public static void main(String[] args) {
Map<EuroDenominations, Integer> rueckgaberechner = rueckgaberechner(3.88);
System.out.println(rueckgaberechner);
System.out.println("\nPretty print:");
rueckgaberechner.entrySet().stream()
.filter(entry -> entry.getValue() != 0)
.forEach(entry -> System.out.printf("%d mal %s\n", entry.getValue(), entry.getKey().symbol()));
}
}代码解释:
立即学习“Java免费学习笔记(深入)”;
通过使用除法和取模运算,可以显著简化找零计算的代码,提高代码效率和可读性。 使用枚举和 Map 可以使代码更具可扩展性和可维护性。 在进行货币计算时,应注意浮点数精度问题。
以上就是优化Java代码:使用除法和取模运算简化找零计算的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号