C 为什么我的最后一次除数没有被执行?

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

这是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 = 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)的文件      //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);
      }