为什么while循环不能正常工作?

时间:2015-08-03 16:08:14

标签: c floating-point cs50

我希望它向用户询问浮动输入以分配给诸如美元之类的货币。最小的单位是一分或0.01,所以我希望每次输入负值或零时重新输入用户输入。虽然状况似乎很好。这有什么问题?

#include <stdio.h>
#include <cs50.h>
#include <math.h>

int main(void)
{ 
    float amount = 0;
    do
    {
    printf("How much change to be returned?\n");
    amount = GetFloat();
    }
    while(amount < 0.01);
}

示例运行:

jharvard@appliance (~/Dropbox/pset1): ./greedy
How much change to be returned?
0.01
How much change to be returned?

正如你所看到的那样,当我输入1美分时,它会重复循环。如果我输入0.02它可以工作,但我想知道它为什么这样做。

3 个答案:

答案 0 :(得分:1)

浮动定义并不能使它们成为比较好的类型。

这可能是类似主题的重复

while loop does not terminate - float arithmetic

答案 1 :(得分:1)

以前的答案是正确的 - 浮点值无法以二进制格式精确表示。因此,您应始终将浮点数与某个错误值进行比较:

更改行

while(amount < 0.01)

while(amount - 0.01 < EPS)

EPS常数定义为(将任何数字设置得足够小以至于无关紧要)

const float EPS = 1e-5;

答案 2 :(得分:0)

0.01无法在float变量中精确表示,因此我得出结论,在您的情况下,0.01的输入转换为大于0.01常量的浮点值,因此循环不会终止输入0.01。

要解决此问题,您可以切换到完整的货币或定点数据类型或更简单地更改程序以使用美分而不是美元,从而避免小数值,尤其是那些无法准确表示的小数值。 Kirhog的另一个经常使用的技术是在比较中使用Epsilon,例如:

double EPSILON = 0.005;
...
while(amount < 0.01+EPSILON);