Java Coin变化评估



我目前正在编写一个程序,该程序仅打印返回零钱时使用的硬币。但是,我收到 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 $%.2fnn", 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");
}
}

你的代码实际上工作正常。但问题是,如果你只是打印你的"changeDue"变量,然后你可以看到最后有一个9。它打印为 0.010000000000000009 而不是您期望的 0.0100000000000000000。然后乘以 100 后将其标记为 2。然后你得到 2 便士作为答案。

实际上,这似乎是小数存储方式的问题。(Java 双精度值 = 0.01 更改为 0.009999999999999787(这里解释得很好。所以你可能需要稍微改变一下你的方法。

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

还有一个正式的货币规范:货币和货币API(JSR 354(,有几个实现,包括Joda Money和官方参考实现。

最新更新