在Java中创建从资金中返回现金的函数

在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

我试图创建一个函数,在购买物品后返回硬币。我还没说完,但下面的代码试图找出应该退回的25美分、10美分、5美分和1美分的数量:

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

    上述代码确实返回了最少数量的硬币——至少在本例中是这样。但请注意,并非所有情况下都必须返回。在某些情况下,最好返回更多价值较低的硬币,而不是价值较高的硬币。

    例如,如果您有硬币
    TWELVY
    (值12)、
    DIME
    (值10)、
    NICKEL
    (值5)和
    PENNY
    (值1),并且零钱是45,那么最少的硬币数量将是5枚(4枚一角硬币和1枚便士),而不是8枚(3枚twelvies、1枚镍币和4枚便士).

    您真的不应该使用浮点值来表示货币。请使用整数,其中任何不是100的倍数的金额都是“美分”部分。谢谢,我会记下。机器应该返回什么?最少的硬币数?是的,最少的硬币数。
    getCoins(95);
    // returns a list with 3 quarters and 2 dimes.