2016-09-24 70 views
2

现在我正在使用C,并且在执行特定任务时遇到了问题。 该任务是能够输入一个数字和硬币的价值将被显示后。我的问题是,假设有0.10美分的变化,我的代码将跳过钱圈(它检查0.10的值是否小于变化的值,然后减去)并继续到镍..然后在变化值变为0.05并且变成硬币后跳过镍,然后硬币停在0.01,并且结束硬币计数,使得计数变短并且比所需时间还长。当float值相等时,如何让for循环继续执行?

int main(void) { 
    float c; 

    int k = 0; 

    printf("How much change?: \n"); 
    c = GetFloat(); 

    //checks for quarters 
    for (float q = 0.25; q <= c; k = k + 1) { 

    c = c - 0.25; 
    printf("q \n"); 
    } 
    //checks for dimes 
    for (float d = 0.10; d <= c; k = k + 1) { 

    c = c - 0.10; 
    printf("d \n"); 
    } 
    //checks for nickels 
    for (float n = 0.05; n <= c; k = k + 1) { 
    c = c - 0.05; 
    printf("n \n"); 

    } 
    //checks for pennies 
    for (float p = 0.01; p <= c; k = k + 1) { 
    c = c - 0.01; 
    printf("p \n"); 
    } 

    printf("%d & %.02f \n", k, c); 
} 

我有一个线索,认为该错误可能是在for循环的条件部分,但我不知道:/

+1

可能重复的[浮点数学是否被破坏?](http://stackoverflow.com/questions/588004/is-floating-point-math-broken) – Olaf

+0

如果人们只是在阅读信息页**之前* *询问... – Olaf

+0

在所有基于C的语言中是否都是这样的? (C++,c#,java) – shinzou

回答

6

你的问题都是由于浮点不精确:二进制浮点不能被精确地转换为十进制符号并从十进制符号转换

它恰好可以用浮点数表示0.25:正如它的许多倍数一样。但是0.1不能。所以你增加这些数额会给你意想不到的行为。

在这种情况下,您最好的选择是使用整数类型并以分为单位工作。