为什么当输入的找零是 2.2 时,输出显示所需最小硬币数的正确答案,但当我输入 4.2 时却显示错误的输出?

Why does output shows correct answer for min number of coins required when the change entered is 2.2 but shows the incorrect output when I enter 4.2?

我是编码新手,我一直在尝试 CS50 的问题 cash.c。在这个问题中,收银员必须分别使用 25、10、5 和 1 美分提供最少的零钱。

我在处理输出时遇到了问题,我只提到了关于使用 25 美分和 10 美分的问题。对于 2.2,我应该得到 10 的答案,这就是我得到的,但是对于 4.2,我应该得到 18,而我得到的答案是 22。为什么会这样?

将不胜感激有用的建议和建设性的批评。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int clear_buffer()
{
int c;
while((c=getchar())!='\n' && c!=EOF);
}
int main(void)
{
fflush(stdin);
float a=0,b=0,c=0,d=0,e=0;
float n;
do
{
printf("The change is ");
}
while ((scanf("%f",&n)!=1) && clear_buffer() || n<0);

while((n-0.25)>=0)
{
    n=n-0.25;
    a++;
}
while((n-0.10)>=0)
{
    n=n-0.10;
    b++;
}
while((n-0.05)>=0)
{
    n=n-0.05;
    c++;
}
while((n-0.01)>=0)
{
    n=n-0.01;
    d++;
}
printf("The minimum coins required are %f", (a+b+c+d));
}

您看到的问题是由 floating point precision limitations. If you debug the program, as I've shown below in a screenshot using onlinegdb (if you're not yet quite familiar with using GDB on the command line, it is essential you learn, but maybe this can be a good first step). This is quite closely related to https://cs50.stackexchange.com/questions/2259/greedy-c-works-for-all-numbers-except-4-2 引起的(其中也有一些针对潜在 workarounds/solutions 的建议)。

注意n减去第一个0.10后的值确实小于0.10,而是0.0999998078,因此它只认为有一个毛钱,而不是2你期待中。

至于建设性的批评,你的缩进有点差(不确定这是不是复制粘贴造成的),你有一个未使用的变量e,你的abcd 变量可以是 int,不一定是浮点数,通过重用 0.25、[=11,你有一些神奇的数字东西=],等等,其中这些应该是预先声明的常量,甚至可能是 #define 语句。还有其他一些东西,如果您真的感兴趣,您可以在姐妹站点 code review 上 post 完成所有您能想到的改进后。