【问题标题】:Java Coin Change EvaluationJava 硬币变化评估
【发布时间】:2019-10-06 03:54:30
【问题描述】:

我目前正在编写一个程序,该程序仅打印归还零钱时使用的硬币。但是,我得到 2 个断言错误,这些错误在服务器的后端进行评估。没有样本测试值,您必须自己编写。

expected:[...  Change Due $0.01  [1 penny] ]
but was:[...  Change Due $0.01  [2 pennies] ]
expected:[...  Change Due $0.19  [1 dime 1 nickel 4 pennies ]
but was:[...  Change Due $0.19  [2 dimes ]
/**
 * Calculate the amount of change based on user input.
 * Output coins with an output greater than 0. 
 * @param args returns an argument array for string objects
 */
public static void main(String[] args) {

    Scanner input = new Scanner(System.in);
    System.out.print("Total amount? ");
    double total = input.nextDouble();
    System.out.print("Cash payment? ");
    double payment = input.nextDouble();
    double changeDue = payment - total;

    System.out.println();
    System.out.printf("Change Due $%.2f\n\n", changeDue);

    int cents = (int) Math.ceil(changeDue * 100);
    int dollars = Math.round((int) cents / 100);
    cents = cents % 100;
    int quarters = Math.round((int) cents / 25);
    cents = cents % 25;
    int dimes = Math.round((int) cents / 10);
    cents = cents % 10;
    int nickels = Math.round((int) cents / 5);
    cents = cents % 5;
    int pennies = Math.round((int) cents / 1);

    int[] coins = {dollars,quarters,dimes,nickels,pennies};
    String[] names = {"dollar", "quarter", "dime", "nickel", "penny"};

    for (int i = 0; i < 5; i++) {
        if (coins[i] == 1) {
            System.out.println(coins[i] + " " + names[i]);
        } else if (coins[i] > 1 && i != 4) {
            System.out.println(coins[i] + " " + names[i] + "s");
        }
    }

    if (coins[4] > 1) {
        System.out.println(coins[4] + " pennies");
    }
}

【问题讨论】:

    标签: java


    【解决方案1】:

    您的代码实际上运行良好。但问题是如果你只是打印你的“changeDue”变量然后你可以看到最后有一个 9。它打印为 0.010000000000000009 而不是您期望的 0.010000000000000000。然后乘以 100 后上限为 2。然后你得到 2 便士作为答案。

    实际上这似乎是小数存储方式的问题。 (Java Double value = 0.01 changes to 0.009999999999999787) 这里解释得很好。所以你可能需要稍微改变你的方法。

    【讨论】:

    • 这个答案没有错,但也不对。您已经回答了这个问题,但我认为它处于错误的抽象级别。您已经告诉发帖人出了什么问题,但没有告诉发布者如何继续前进以及如何取得解决方案。 OP 说,“帮助这个鸡蛋被打破”,而你说,“是的,蛋壳通过破碎来应对冲击”,而他们实际上需要有人给他们拿一块布来清理它:)
    【解决方案2】:

    您在 Java 中犯了一个相当常见的错误。 double不能代表金钱,它们是不同的东西。在 Java 中,我们最接近金钱的东西称为BigDecimal。这有点尴尬,因为你不能使用算术符号(+-/*^%),但它更准确。

    还有一个正式的货币规范:Money and Currency API (JSR 354),其中有几个实现,包括 Joda Moneythe offical reference implementation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 2016-01-24
      • 2017-10-28
      • 2014-01-11
      • 1970-01-01
      • 1970-01-01
      • 2012-07-04
      相关资源
      最近更新 更多