我是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美元。
答案 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;
...