为什么我的最后一个部门没有被执行?

Why my last divison is not being executed?

这是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);
  }

当我尝试获取至少需要一分钱的硬币总数时,除法不会发生,因此硬币数不会增加。那么,为什么?

浮点数可能总是会导致这类问题,这里的解决方案是给你的浮点数一个范围。例如,不要查找 if x>0.01,而是查找 x>(0.01-0.000001)

虽然使用浮点数总是使用范围,但永远不要寻找特定数字。

Why my last division is not being executed?

由于 OP d 小于 0.01,所以 d >= 0.01 不正确。

这是因为像 0.05 这样的浮点值是 dyadic rationals,而不是 10 的幂的倍数,而不是 正好 0.05。


相反,避免用钱累积舍入误差。考虑使用最小货币单位的整数,比如 0.01 和 longlong long.

类型

读取浮点值,缩放到美分和四舍五入。

  // double d;
  long d_cents;
  ...
  do {
      //d = get_float("Change owed: ");
      d_cents= lround(100.0 * get_float("Change owed: "));
  } while(d_cents < 0);

相应地缩放数学。

      //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);
      }