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

如何在Java中获得更精确的值,java,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

我刚刚开始学习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);

25美分、10美分和5美分的硬币似乎很好用,但一旦达到了1美分,其金额大约为0.00999999999887,如果初始金额的第一百位是3,4,7,8,9,那么所需的硬币总是短的1美分。

在处理货币时,千万不要因此而使用浮点。相反,使用整数类型表示美分数:

amount = 163;
final QUARTER = 25;
final DIME = 10;
...

答案是不要使用
double
。它是一个IEEE 754 64位浮点数,即使像0.1这样简单的十进制值也不能可靠地表示为
double
s。注“十进制”:我们写数字的方式是以10为基数;对于IEEE 754,浮点数使用基数2


改用
BigDecimal
。如果您关心性能,请使用。

啊,是的,这个问题在Bloch的有效Java中出现。这是一个浮点数问题,而不是特定于Java的。如果您只是在学习java,很难对其进行全面的解释,但它与浮点数的最大精度有关,要解决这个问题,您必须考虑到与精度相关的文章的损失,这些文章关于在需要精确答案时不使用双精度,并且不要将其用于货币:您可以使用,和一个精确到你想要的。