我在EDX的Pset1:计算机科学,并且我在“改变时间”的最后。 在这里你应该制作一个代码,一旦给出一个数字,应该找到你需要的最少量的硬币。 我已经制作了我的代码,但我似乎无法找到如何使它找到最小。这是我的代码:
{
printf ("How much do I owe you?\n"); //Get a non-negative number
float change = GetFloat();
while (change < 0)
{
printf ("Please enter a non-negative number\n");
change = GetFloat();
}
int total = 0;
while (change >=.25)
{
change = change - .25;
total++;
}
while (change >=.1 && change <.25)
{
change = change - .1;
total++;
}
while (change >=.05 && change <.10)
{
change = change - .05;
total++;
}
while (change > 0 && change <.05)
{
printf ("%i\n", total);
}
当我输入.15时,它给出了3的答案,但它应该说2。 另外,我做的其他一些事情给了我一个数字,但它不是最小的。 我怎样才能做到总能找到最低金额?
答案 0 :(得分:1)
您应该做的第一件事是不使用浮点数来表示货币。涉及浮点数的算术运算不够精确,无法用于货币。将其更改为int
。之后,您可以使用/
和%
来计算硬币数量。
int amountOwed = ...; // Amount owed in cents
int total = amountOwed/25; // Number of quarters.
amountOwed = amountOwed % 25; // Amount after the number of quarters.
total += amountOwed/10; // Number of dimes.
amountOwed = amountOwed % 10; // Amount after the number of dimes.
total += amountOwed/5; // Number of nickels.
amountOwed = amountOwed % 5; // Amount after the number of nickels.
// Whatever is left is number of pennies.
total += amountOwed; // Number of pennies.
答案 1 :(得分:1)
候选路径:
1)在比较float
值时,请将0.15
等值的表示形式的不精确性视为float
。最后,需要解决0.01的小数。
// while (change >=.1 && change <.25)
min_unit = 0.01;
while (change >= (0.10f - min_unit/2)) /* BTW: compare again 0.25 not needed */)
2)将GetFloat()
的返回值转换为最低货币单位的整数。
min_unit = 0.01;
change = round(GetFloat()/min_unit);
while (change >= 25.0)
....
while (change >= 10.0)
....
3)将GetFloat()
的返回值转换为最小货币单位的整数。
min_unit = 0.01;
long long Ichange = round(GetFloat()/min_unit);
while (Ichange >= 25 /* min_units */)
....
while (Ichange >= 10 /* min_units */)
....
什么是最好的取决于OP没有给出的问题。数字范围,需要进行的+,-,*
以外的计算,复利,税收等。
通常对于更精简的程序,使用#3就足够了。
答案 2 :(得分:0)
您正在尝试使用浮点数来跟踪整数分数。这将永远不会起作用,因为浮点是一种有限精度表示方案,并不是您所使用的每个值都可以精确表示。使用整数。
这是一个类比,以说明为什么这不起作用。想象一下,如果我们有硬币代表三分之一美元而你使用的是五位十进制浮点数。一美元硬币的三分之一将表示为“0.33333”。一美元,当然是“1.00000”。问题是,当您从一美元三次减去三分之一硬币时,不得到零,由于四舍五入错误,您得到“0.00001”。
除非您不需要确切的结果,否则不要使用有限精度方案来表示它们无法准确表示的值。要指定硬币数量,您需要准确的结果。