<分区>
我有这个功能:
int change(float c)
{
float coins[] = {0.25, 0.10, 0.05, 0.01};
int count[] = {0, 0, 0, 0};
while(c > (0.00))
{
printf("I entered here\n");
if((c-coins[0]) >= (0.00))
{
c -= coins[0];
count[0]++;
printf("-0.25, c = %.2f\n", c);
}
else if((c-coins[1]) >= (0.00))
{
c -= coins[1];
count[1]++;
printf("-0.10, c = %.2f\n", c);
}
else if((c-coins[2]) >= (0.00))
{
c -= coins[2];
count[2]++;
printf("-0.05, c = %.2f\n", c);
}
else if((c-coins[3]) >= (0.00))
{
c -= coins[3];
count[3]++;
printf("-0.01, c = %.2f\n", c);
}
}
printf("(%d) 25 cents, (%d) 10 cents, (%d) 5 cents, (%d) 1 cents\n",
count[0], count[1], count[2], count[3]);
int total = count[0] + count[1] + count[2] + count[3];
return total;
}
每当我尝试输入 0.06 或 0.07,或任何会导致它到达最后一个 else if
子句(else if((c-coins[3] ) >= (0.00))
) 会导致死循环。
而如果我输入 0.25、0.10、0.05 和它们各自的完美倍数,函数运行顺利。 (因为它可能不会到达最后一个 else if
子句)。
所以当我调试时(使用简单的 printf
技术),我发现变量 c
仍然 进入了 while
循环,即使它已达到 0.00。在某些情况下,它甚至会达到 -0.00 或 -0.01(这只有在我将 else if((c-coins[3]) >= (0.00))
更改为 时才有效否则
)。
例子(假设代码中的else if
已经是else
only):
输入:0.06
c-0.05, c = 0.01
c-0.01, c = -0.00 **<- WTF**
(0) 25 cents, (0) 10 cents, (1) 5 cents, (1) 1 cents
Total Coins: 2
有人给我解释一下吗?我在这里错过了一些关于 float 的规则吗?或者某些错误是由我的最后一个 else if
子句引起的?
注意:将最后一个 else if
更改为 else
可能有效,但会影响最终答案。此外,将 while
条件更改为 -0.00
或 0.001
也不起作用。