C程序用while循环计算硬币

C program counting coins with while loops

我看到很多人提到这个特定的 C 程序,尽管形式有所不同。但是,我似乎无法确定问题的根源,也无法找到其他有帮助的答案。除了一个输入:4.2

之外,程序可以正确编译甚至执行

除了 4.2 之外,该程序似乎在计算进行找零所需的最小硬币数。它输出 22 而不是它应该输出的 18(16 个 25 美分,2 个角钱)。 有什么想法吗?我正在旁听在线课程,没有 credit/no 学术不端问题。

#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;    
 }

许多数字无法用浮点数正确表示。 4.2 可能存储为 4.19999999 或类似的东西。

从浮点数到整数的转换不正确,可能会导致舍入错误:

//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

我不知道 GetFloat() 是什么,但您必须考虑 4.2 的浮点表示将是 4.19999981。 你可以测试它添加 printf("a=%.8f", a);

然后当你 "convert" float 到 int 时 i 的值将是 419.

计算硬币的代码运行良好,是您输入的不是您认为的那样。

THIS 可以帮助您更好地理解 float 到 int 的转换。

您刚刚被 floating point precision 盗版了。

你声明了

float a;

所以,当

a = 4.2; // say

看起来像

a = 4.19999981

因此,i= a*100; 被分配 419i 而不是 420(您所期望的)。

你需要convert float a into integer

(int)(x + 0.5)

所以,而不是 i= a*100 试试

i= a*100 + .5;