将货币值作为浮点数进行比较不起作用

时间:2014-03-02 10:30:56

标签: c if-statement

如果我输入0.01或0.02,程序会立即退出。我该怎么办?

#include <stdio.h>

char line[100];
float amount;

int main()
{
printf("Enter the amount of money: ");
fgets(line, sizeof(line), stdin);
sscanf(line, "%f", &amount);

if (amount == 0.0)
    printf("Quarters: 0\nDimes: 0\nNickels: 0\nPennies: 0");

if (amount == 0.01)
   printf("Quarters: 0\nDimes: 0\nNickels: 0\nPennies: 1");


if (amount == 0.02)
   printf("Quarters: 0\nDimes: 0\nNickels: 0\nPennies: 2");

return (0);
}

4 个答案:

答案 0 :(得分:3)

What is the most effective way for float and double comparison?

你应该使用这样的东西

bool isEqual(double a, double b)
{
    return fabs(a - b) < EPSILON;
}

或者

#define ISEQUAL(a,b) ( fabs((a) - (b)) < EPSILON)

并定义EPSILON

#define EPSILON (0.000001)

答案 1 :(得分:3)

首先,不要尝试比较double,或比较float,或将doublefloat进行比较(例外:与0比较是好的,可以说是所有整数)。其他答案给出了很好的联系,但我特别喜欢:http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

其次,如果您正在处理一笔款项,请不要使用double,或尽快退出double。要么使用定点库(对于你想要的东西有点复杂),要么就是:

int cents = (int)round(amount * 100);

然后使用cents。您可以将这些与心脏的内容进行比较。

第三,如果这里的想法是改变宿舍,角钱,镍币和便士,那么if陈述的集合不是要走的路,除非你喜欢冗长而低效的程序。您需要以编程方式执行此操作。如果上面有cents的整数,那么这将更简单(提示:查看%运算符)。

答案 2 :(得分:1)

我认为我们可以扩展一个因素并进行相对比较:

#define EPSILON (0.000001)

if (fabs(a - b) <= EPSILON * fmax(fabs(a), fabs(b))) {
}

比绝对比较更健壮:

if (fabs(a - b) <= EPSILON ) {
    // ...
}

可能与规模有关。顺便说一句,最佳比例也取决于函数,我们不应该使用相同的公式来记录日志和罪恶。

答案 3 :(得分:-6)

将您的比较值声明为浮点数。

if (amount == 0.01f)
   printf("Quarters: 0\nDimes: 0\nNickels: 0\nPennies: 1");

请注意,如果使用float变量进行一些计算,可以通过直接测试float相等性来遇到一些未定义的行为。