当 while 循环不应该执行时出现问题 (c)



因此,作为计算机科学课程的一部分,我一直在做一点C。其中一个挑战是创建一个程序,告诉假设的收银员他们需要多少硬币才能给顾客找零。我用一组while循环完成了这项工作,整个程序看起来像这样:

#include <stdio.h>
#include <cs50.h>
int main(void)
{
float f;
int i;
i=0;
do
{
f = get_float("Input Change: n");
}
while(f<0);
// This do-while loop uses a get_float operator to get a postive input from the user.
while(f>=0.25)
{
f=f-0.25;
i=i+1;
}
// Each one of these loops represents using one kind of coin. For this one, every time it runs it adds
// one coin to the final tally and removes 25 cents from the change owed.
while(f>=0.10)
{
f=f-0.10;
i=i+1;
}
// Dime loop, subtracts ten from change owed.
while(f>=0.05)
{
f=f-0.0500000;
i=i+1;
}
// Nickel loop, subtracts five from change owed.
while(f>0)
{
f=f-0.01;
i=i+1;
}
// Penny loop, subtracts one from change owed.
printf("You need %i coins.%fn", i, f);
//This just prints the number of coins needed.
}

问题是,即使在没有理由的情况下,我们也会随机执行最后一个while循环。例如,$0.42返回一个正确的值,而$0.15导致最后一个while循环无故增加一分钱。

while(f>0)
{
f=f-0.01;
i=i+1;
}

(有问题的while循环(

一般来说,我是编程新手,所以这可能只是我做了一些愚蠢的事情造成的问题,但我不知道我到底做错了什么。以前有人遇到过这种情况吗?

这是一个精度问题。与浮点数相等可能存在相当大的问题。即使在理论上f=0,当你到达最后一个循环时,它也会失败,并进入循环。

一个可能的解决方法是将其更改为00.01之间的某个数字。例如

while(f>0.005)

但更好的方法是使用类型int来表示货币,每个单位对应一美分。

对于浮点值,将它们与其他浮点值(如5、0.63和0.0(进行比较会变得"奇怪",因为您的值实际上可能是0.4999999999或0.000000000001,这基本上是零,在您的情况下,未通过条件测试,因此当值真正变为负数时,会增加最后一分钱。当比较浮动时,您必须通过将差异与某个小的ε值进行比较来说明这一点。

float epsilon = 0.0000001;
if ((f - testVal) < epsilon) {
...
}

最新更新