将货币值作为浮点数进行比较不起作用
如果我输入0.01或0.02,程序会立即退出。 我该怎么办? 谢谢。
我的post主要是代码。 我需要添加更多细节。
#include 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); }
将您的比较值声明为浮点数。
if (amount == 0.01f) printf("Quarters: 0\nDimes: 0\nNickels: 0\nPennies: 1");
请注意,如果使用float变量进行一些计算,则可以通过直接测试float相等性来遇到一些未定义的行为。
浮动和双重比较最有效的方法是什么?
你应该使用这样的东西
bool isEqual(double a, double b) { return fabs(a - b) < EPSILON; }
或这个
#define ISEQUAL(a,b) ( fabs((a) - (b)) < EPSILON)
并定义EPSILON
#define EPSILON (0.000001)
首先,不要尝试比较double
s,或者比较float
s,或者将double
s与float
s进行比较(例外:0比较可以,可以说是所有整数)。 其他答案给出了很好的链接原因,但我特别喜欢: http : //docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
其次,如果你正在处理一笔钱,不要使用double
,或尽快摆脱double
。 要么使用定点库(对于你想要的东西有点复杂),要么只是:
int cents = (int)round(amount * 100);
然后用cents
代替。 您可以将这些与心脏的内容进行比较。
第三,如果这里的想法是改变宿舍,角钱,镍币和便士, if
语句的集合不是要走的路,除非你喜欢冗长而低效的程序。 您需要以编程方式执行此操作。 如果你有更高的整数%
,那将更容易(提示:查看%
运算符)。
我认为我们可以扩展一个因子并进行相对比较,如下所示:
#define EPSILON (0.000001) if (fabs(a - b) <= EPSILON * fmax(fabs(a), fabs(b))) { }
这比绝对比较更强大:
if (fabs(a - b) <= EPSILON ) { // ... }
这可能是规模依赖的。 顺便说一句,具有最佳比例也取决于函数,我们不应该使用相同的公式来记录日志和犯罪。