因此,作为计算机科学课程的一部分,我一直在做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循环)
我一般都不是编程新手,所以这可能只是我做一些愚蠢的事情所引起的问题,但是我不知道到底是我做错了什么。有人遇到过吗?
答案 0 :(得分:3)
这是一个精度问题。浮点数的平等可能会带来很多问题。即使从理论上f=0
到最后一个循环,它也会失败,并进入循环。
可能的解决方法是将其更改为0
和0.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) {
...
}