在不应该执行(c)

时间:2018-11-17 00:53:03

标签: c while-loop cs50

因此,作为计算机科学课程的一部分,我一直在做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.%f\n", 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循环)

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

2 个答案:

答案 0 :(得分:3)

这是一个精度问题。浮点数的平等可能会带来很多问题。即使从理论上f=0到最后一个循环,它也会失败,并进入循环。

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

while(f>0.005)

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

答案 1 :(得分:1)

使用浮点值时,将其与其他浮点值(例如5、0.63和0.0)进行比较会变得“怪异”,因为您的值实际上可能是0.4999999999或0.000000000001,该值实际上为零,并且在您的情况下未通过条件测试,因此当该值真正变为负数时增加最后一分钱。比较浮标时,您必须通过将差异与某个较小的ε值进行比较来解决这一问题。

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