【问题标题】:How can i get a value to be more exact in Java [duplicate]我如何在Java中获得更准确的值[重复]
【发布时间】:2014-02-15 18:53:16
【问题描述】:

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

Quarters, dimens, and Nines 似乎可以正常工作,但一旦达到便士,金额类似于 0.0099999999999887,如果初始金额的百分之一为 3,4,7,8,9,则 penniesNeeded 总是短一.

【问题讨论】:

标签: java


【解决方案1】:

在处理货币时,出于这个原因,您永远不应该使用浮点数。相反,使用整数类型表示美分数:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-12
      • 1970-01-01
      相关资源
      最近更新 更多