如何在Java中获得更准确的值

时间:2014-02-15 18:53:16

标签: java

我刚刚开始学习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总是很短

2 个答案:

答案 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