C 为什么我的最后一次除数没有被执行?
这是CS50问题1“现金”的代码:C 为什么我的最后一次除数没有被执行?,c,math,cs50,C,Math,Cs50,这是CS50问题1“现金”的代码: #include <stdio.h> #include <math.h> #include <cs50.h> int main(void) { double d; int coins = 0; do { d = get_float("Change owed: "); } while(d < 0); for (int i
#include <stdio.h>
#include <math.h>
#include <cs50.h>
int main(void) {
double d;
int coins = 0;
do {
d = get_float("Change owed: ");
} while(d < 0);
for (int i = 0; i <= 5; i++) {
if (d == 0) break;
if (d >= 0.25) {
coins += d / 0.25;
d = fmod(d, 0.25);
printf("\nd0: %f\n", d);
printf("coins0: %d\n\n", coins);
}
else if (d >= 0.10) {
coins += d / 0.1;
d = fmod(d, 0.1);
printf("\nd1: %f\n", d);
printf("coins1: %d\n\n", coins);
}
else if (d >= 0.05) {
coins += d / 0.05;
d = fmod(d, 0.05);
printf("\nd2: %f\n", d);
printf("coins2: %d\n\n", coins);
}
else if (d >= 0.01) {
coins += d / 0.01;
d = fmod(d, 0.01);
printf("\nd3: %f\n", d);
printf("coins3: %d\n\n", coins);
}
}
printf("coins: %d\\n\n", coins);
}
#包括
#包括
#包括
内部主(空){
双d;
整数=0;
做{
d=获得浮动(“欠下的更改:”);
}d<0;
对于(int i=0;i=0.25){
硬币+=d/0.25;
d=fmod(d,0.25);
printf(“\nd0:%f\n”,d);
printf(“硬币0:%d\n\n”,硬币);
}
如果(d>=0.10),则为else{
硬币+=d/0.1;
d=fmod(d,0.1);
printf(“\nd1:%f\n”,d);
printf(“硬币1:%d\n\n”,硬币);
}
如果(d>=0.05),则为else{
硬币+=d/0.05;
d=fmod(d,0.05);
printf(“\nd2:%f\n”,d);
printf(“硬币2:%d\n\n”,硬币);
}
如果(d>=0.01),则为else{
硬币+=d/0.01;
d=fmod(d,0.01);
printf(“\nd3:%f\n”,d);
printf(“硬币3:%d\n\n”,硬币);
}
}
printf(“硬币:%d\\n\n”,硬币);
}
当我试图得到至少需要一便士的硬币总数时,除法不会发生,所以硬币的数量不会增加。那么,为什么呢?浮点可能总是会导致此类问题,这里的解决方案是给浮点数一个范围。例如,如果x>0.01,不要查找,而是查找x>(0.01-0.000001) 使用浮点时,请始终使用范围,不要查找特定的数字 为什么我的最后一个师没有被执行 作为OP,
d
小于0.01,因此d>=0.01
不是真的
这是因为像0.05这样的浮点值不是10的幂的倍数,也不完全是0.05
相反,用金钱避免累积的舍入误差。考虑使用最小单位货币的整数,例如0.01和类型<代码>长< /COD>或<代码>长Lo/<代码> < /P> 读取浮点值,缩放至美分和四舍五入
// double d;
long d_cents;
...
do {
//d = get_float("Change owed: ");
d_cents= lround(100.0 * get_float("Change owed: "));
} while(d_cents < 0);
浮点运算有舍入误差。这会导致您的程序无法正常工作,因为您使用的十进制数不能用二进制浮点表示。重写您的程序以仅使用整数算术。用整数来计算分而不是美元。如果必须以浮点数形式获取输入,请立即将其转换为整数,方法是乘以100并四舍五入到最接近的整数。将来,当询问程序为什么不能工作时,请始终包括样本输入、样本观察输出和样本预期输出。没有理由循环6次。您可以将所有的“elseif”更改为“if”,并去掉for语句。此外,您是否试图确定退回的硬币总数或每种硬币类型的总数?更改
printf(“\nd2:%f\n”,d)代码>和其他到printf(“\nd2:%.25f\n”,d)的文件了解代码失败的原因。我试过chucx说的,0.01不是0.01,而是0.009。。。因此,我做了一些不推荐的事情:如果数字为==0.01,则添加0.01。但我提交了Eric建议的版本。
//else if (d >= 0.05) {
// coins += d / 0.05;
// d = fmod(d, 0.05);
// printf("\nd2: %f\n", d);
// printf("coins2: %d\n\n", coins);
//}
else if (d_cents >= 5) {
coins += d_cents / 5;
d_cents %= 5;
printf("\nd2: %0.2f\n", d_cents/100.0);
printf("coins2: %d\n\n", coins);
}