代码之家  ›  专栏  ›  技术社区  ›  Alexa Jenasoba

Java硬币兑换评估

  •  0
  • Alexa Jenasoba  · 技术社区  · 5 年前

    我目前正在写一个程序,只打印硬币使用时,返回零钱。但是,我得到了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");
        }
    }
    
    1 回复  |  直到 5 年前
        1
  •  0
  •   Mahesh    5 年前

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

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

        2
  •  0
  •   Software Engineer    5 年前

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

    还有一个货币的正式规范:货币和货币API(JSR 354),其中有两个实现包括 Joda Money the offical reference implementation 是的。