我刚接触CS和编程,正在尝试为CS现金问题集1编写代码。我不认为这是预期的解决方案,而且我知道这不是简洁的代码,但是在这一点上,我只是想使其运行。我想知道我编写的代码是否完全乱码,或者是否真的可以工作,因为从理论上讲对我来说这是合理的。
#include<stdio.h>
#include<cs50.h>
#include<math.h>
int main(void)
{
float change;
do
{
change= get_float("Enter change here\n");
}
while(change<0);
int quarter=floor(change/0.25);
int dime=floor((change-(quarter*0.25))/0.10);
int nickel=floor((change-(quarter*0.25)-(dime*0.10))/0.05);
int penny=round((change-(quarter*0.25)-(dime*0.10)-(nickel*0.05))/0.01);
int sum =quarter+nickel+dime+penny;
printf("%i",sum);
}
答案 0 :(得分:1)
这是许多初学者难以解决的常见问题,即浮点数的不精确性。使用浮点数和双精度数进行运算时,结果值可能会以小数点后缀的形式出现偏移。您可以在以下{@ 3}这样的SO帖子中了解更多信息。
无论如何,您的程序涉及浮点除法和整数Why are floating point numbers inaccurate?,它们通常不能很好地协同工作。在输入$ 4.20的示例中,将四分之一设置为16之后,在计算角钱时,(4.2-0.25 x 16)/ 0.10实际上保存为1.999998,而不是2。然后将其截断(因为dime是int值)并另存为1,这说明了程序给您的输出不准确。一种解决方案是将所有内容乘以100,并使用整数除法以避免不精确。因此,上面的示例将变为(420-25 x 16)/ 10,它将正确地另存为2角钱。