如果我输入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);
}
答案 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
,或将double
与float
进行比较(例外:与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相等性来遇到一些未定义的行为。