我刚刚开始学习Java,我似乎无法使用这个计算器。 我希望有一个可变数额,并从中计算出这个数量所需的最少数量的硬币。
这是我的计划:
double amount, quarters, dimes, nickels, pennies;
int quartersNeeded, dimesNeeded, nickelsNeeded, penniesNeeded;
amount = 1.63;
quarters = 0.25;
dimes = 0.1;
nickels = 0.05;
pennies = 0.01;
quartersNeeded = (int)(amount / quarters);
amount = amount - (quartersNeeded * 0.25);
dimesNeeded = (int)(amount / dimes);
amount = amount - (dimesNeeded * 0.1);
nickelsNeeded = (int)(amount / nickels);
amount = amount - (nickelsNeeded * 0.05);
penniesNeeded = (int)(amount / pennies);
amount = amount - (penniesNeeded * 0.01);
System.out.println(amount);
System.out.println(quartersNeeded);
System.out.println(dimesNeeded);
System.out.println(nickelsNeeded);
System.out.println(penniesNeeded);
季度,硬币和镍币似乎工作正常,但一旦达到便士,金额就像0.0099999999999887,如果初始金额的第100位是3,4,7,8,9,则penniesNeeded总是很短
答案 0 :(得分:3)
在处理货币时,您不应该因此而使用浮点数。相反,使用整数类型作为分数:
amount = 163;
final QUARTER = 25;
final DIME = 10;
...
答案 1 :(得分:0)
答案是不使用double
。它是一个IEEE 754 64位浮点数,即使像0.1这样简单的十进制值也不能可靠地表示为double
s。注意“十进制”:我们写数字的方式是使用基数10;对于IEEE 754,浮点数使用基数2.
请改用BigDecimal
。如果您关心性能,请使用apfloat。