在Java中创建从资金中返回现金的函数
我试图创建一个函数,在购买物品后返回硬币。我还没说完,但下面的代码试图找出应该退回的25美分、10美分、5美分和1美分的数量:在Java中创建从资金中返回现金的函数,java,if-statement,Java,If Statement,我试图创建一个函数,在购买物品后返回硬币。我还没说完,但下面的代码试图找出应该退回的25美分、10美分、5美分和1美分的数量: public String getChange(VendingMachine vendingMachine, Change change) { double dispensedQuarters = 0; double dispensedDimes = 0; double dispensedNickels = 0; double dis
public String getChange(VendingMachine vendingMachine, Change change) {
double dispensedQuarters = 0;
double dispensedDimes = 0;
double dispensedNickels = 0;
double dispensedPennies = 0;
double d = Double.parseDouble(vendingMachine.getFunds());
if (d % .25 == 0) {
dispensedQuarters = d / .25;
} else if (d % .25 != 0) {
double remainder = d % .25;
d = d - remainder;
dispensedQuarters = d / .25;
if (remainder % .10 == 0) {
dispensedDimes = remainder / .10;
} else if (remainder % .05 == 0) {
dispensedNickels = remainder / .05;
} else if (remainder % .01 == 0) {
dispensedPennies = remainder / .01;
} else {
dispensedDimes = dispensedNickels = dispensedPennies = 0;
}
} else if (d % .10 == 0) {
dispensedDimes = d / .10;
} else if (d % .05 == 0) {
dispensedNickels = d / .10;
}
}
是否有一种更简洁的方法来创建一个函数,该函数将查找应返回的25美分、10美分、5美分和1美分的数量?我发现一些代码存在一些问题
如果(余数%.10==0){
这只会告诉你是否可以用一角硬币支付剩余的硬币,而不会告诉你是否需要一两个一角硬币。例如,如果剩余的硬币是0.23,即使你应该支付两个一角硬币,这个条件也是错误的
}如果(余数%.05==0){
同样的问题。如果你还有0.07英镑要付,这个条件是错误的,但支付五分硬币仍然是合适的
else如果(余数%.01==0){
这种检查似乎是不必要的,去掉它可能会使代码更加紧凑。这永远都是正确的,除非你因为某种原因有零头。(这可能是由于舍入错误,正如注释中指出的那样,使用整数可以避免舍入错误。)注意:calculateChange-以美分为参数
public class QuarterDimeNickelPenny {
public static void main(String[] args) {
calculateChange(94); // Should be 3, 1, 1, 4
calculateChange(50); // Should be 2, 0, 0, 0
calculateChange(30); // Should be 1, 0, 1, 0
calculateChange(14); // Should be 0, 1, 0, 4
calculateChange(69); // Should be 2, 1, 1, 4
calculateChange(75); // Should be 3, 0, 0, 0
}
private static void calculateChange(int cents) {
int quarters = cents / 25;
int leftover = cents - quarters * 25;
int dimes = leftover / 10;
leftover = leftover - dimes * 10;
int nickels = leftover / 5;
leftover = leftover - nickels * 5;
int pennies = leftover;
System.out.println(quarters + ", " + dimes + ", " + nickels + ", " + pennies);
}
}
试试这个,希望它能帮助你你可以通过使用
enum
s更优雅地完成这个任务
- 只需使用
创建不同的enum
对象,并在构造函数中添加值。确保Coin
实例按降序排列enum
enum Coin { QUARTER(25), DIME(10), NICKEL(5), PENNY(1); private final int value; private Coin(int value) { this.value = value; } public int getValue() { return this.value; } }
- 然后迭代所有不同类型的硬币,从零钱中减去尽可能多的硬币,直到剩余的硬币价值小于硬币价值
private List<Coin> getCoins(int value) { List<Coin> coins = new ArrayList<>(); // Loop over all different kind of coins, starting with the coin // with the highest value for (Coin coin : Coin.values()) { // For each kind, subtract the coin value as many times as // possible, then advance to the next coin. while (value >= coin.getValue()) { value -= coin.getValue(); coins.add(coin); } } return coins; }
上述代码确实返回了最少数量的硬币——至少在本例中是这样。但请注意,并非所有情况下都必须返回。在某些情况下,最好返回更多价值较低的硬币,而不是价值较高的硬币。
例如,如果您有硬币
(值12)、TWELVY
(值10)、DIME
(值5)和NICKEL
(值1),并且零钱是45,那么最少的硬币数量将是5枚(4枚一角硬币和1枚便士),而不是8枚(3枚twelvies、1枚镍币和4枚便士).您真的不应该使用浮点值来表示货币。请使用整数,其中任何不是100的倍数的金额都是“美分”部分。谢谢,我会记下。机器应该返回什么?最少的硬币数?是的,最少的硬币数。PENNY
getCoins(95); // returns a list with 3 quarters and 2 dimes.