Java问题解决。这是对的吗?

时间:2010-12-24 16:10:51

标签: java math

大家圣诞快乐。在圣诞老人到来之前,我确实有一个问题。

我是Java的新手,所以我正在浏览我的Java书,我正在练习第一章。

这是问题, “写入和应用程序,用于确定罐子中硬币的价值,并以美元和美分打印总数。读取表示季度,硬币,镍币和便士数量的整数值。”

我实际上是做了这个程序。但我想知道我是否做得对。

public class PP28 {
  public static void main(String[] args) {

    // cents = pennies.

    double quarters = 0.25 * 40;
    double dimes = 0.1 * 200;
    double nickels = 0.05 * 400;
    double pennies = 0.01 * 150;
    int total;
    int cent;


    total =  (int) quarters + (int) dimes + (int) nickels + (int) pennies;
    cent = 100 % total;
    System.out.println(total+" dollars and "+cent+" cents");

  }
}

它编译并运行良好。另外,我想知道这在数学上是否正确?我应该得到49美分几乎相当于51美分。(5)$?因为所有季度,硬币,镍币和硬币的总和为51.5美元。

4 个答案:

答案 0 :(得分:4)

由于舍入错误,我会避免使用浮点类型。

Here是一篇很好的文章,解释了这个问题(每个计算机科学家应该知道的关于浮点算术的内容)。

使用整数来计算分数。

这样的事情:

integer quarters = 25 * numOfQuarters;

你可以用100跳水来获得美元金额。

答案 1 :(得分:3)

Oded的回答肯定是要实施的。使用整数。

但是你有另一个问题:cent = 100 % total; 这段代码没有按照你的想法去做。

因为total是一个整数,所以总结如下:

total =  (int) quarters + (int) dimes + (int) nickels + (int) pennies;

你的结果是51.即使是51美元。您通过将双值(四分之一,硬币,镍币和便士)转换为整数,丢失了有关分数美元的所有信息。如果季度的值为10.25,则(int)季度为10。

现在,您正在尝试使用cent = 100 % total;获取剩余分数。这样可以得到整数余数100 /总数。在你的情况下100 / 51.剩余的剩余是49,你存储在'分'。它恰好发生在你的例子中,接近正确的值。这就是为什么你的答案不正确,而不是四舍五入。

所有这一切,你应该仍然使用整数来表示你的所有价值观。

答案 2 :(得分:1)

更容易处理一个表示形式,例如美分,然后将其转换为美元。 Oded关于浮点舍入误差的评论是正确的。

我觉得奇怪的是,当值为1.5时,你将便士转换为整数,这似乎不正确。可以这样做:

int quarters = 25 * 40;
int dimes = 10 * 200;
int nickels = 5 * 400;
int pennies = 1 * 150;

int sum = quarters + dimes + nickels + pennies;
int dollars = sum / 100;
int cents = sum % 100;

当打印美元和美分的价值时,我得到51美元和50美分。

答案 3 :(得分:1)

除了提到的问题之外,问题还有季度,硬币,镍币和便士的数量。这意味着从文件中读取,而不是硬编码为常量。

此外,季度,硬币,镍币和便士的货币价值不太可能很快改变。它们应该被声明为静态最终变量:

class PP28 {
 final int QUARTER = 25;
...