我已经看到这个特别的C程序提到了很多,尽管有一些不同的形式。但是我似乎无法找出问题的根源,或者找到另一个有帮助的答案。除了单个输入外,程序编译甚至正确执行:4.2
程序似乎计算了输入更改所需的最小硬币数量,但4.2除外。它应该输出22而不是18(16个季度,2角钱)。 有什么想法吗?我正在审核在线课程,没有学分/没有学术不诚实问题。
#include <stdio.h>
#include <cs50.h>
int main(void)
{
//quarters, dimes, nickels, and total number of coins. a is float input for exact change.
float a;
int q=0;
int d=0;
int n=0;
int p=0;
int i;
//petitioning input
do
{
printf("Hello, how much change do I owe you?\n");
a = GetFloat();
}
while(a<=0);
//converting float a to an integer i
i= a*100;
//four 'while' loops checking quarters nickels dimes pennies and adding to coin count while
while(i>=25)
{
i=i-25;
q++;
}
while(i>=10 && i<25)
{
i=i-10;
d++;
}
while(i>=5 && i<10)
{
i=i-5;
n++;
}
while(i>0 && i<5)
{
i= i-1;
p++;
}
//printing sum of each coin type
{
printf("%d\n", q+d+n+p);
}
return 0;
}
答案 0 :(得分:3)
你刚被floating point precision伪造。
你宣布了
float a;
所以,当
a = 4.2; // say
看起来像
a = 4.19999981
因此,i= a*100;
被419
分配到i
而不是420
(您所期望的)。
解决方案您需要convert 浮动 a
进入整数:
(int)(x + 0.5)
所以,而不是i= a*100
尝试
i= a*100 + .5;
答案 1 :(得分:2)
许多数字无法在浮点数中正确表示。 4.2可能存储为4.19999999或类似的东西。
从float到integer的转换不正确,可能导致舍入错误:
//converting float a to an integer i
i= a*100;
在你的情况下,4.2的数字变为419美分。
将其更改为:
//converting float a to an integer i
i= a*100 + 0.5f;
有关详细信息,请阅读以下文章:
What Every Computer Scientist Should Know About Floating-Point Arithmetic, by David Goldberg
答案 2 :(得分:1)
我不知道GetFloat()
是什么,但您必须考虑4.2
的浮动表示形式为4.19999981
。
您可以测试它添加printf("a=%.8f", a);
然后当你&#34;转换&#34; float to int i
的值为419
。
计算硬币的代码效果很好,您的输入不是您认为的。
THIS可以帮助您理解betetr float to int conversion。