我目前正在编写一个贪婪的算法,但在比较浮点数时我偶然发现了一个问题。
我会使用这样的代码:
float f = 0;
if (f == 0) {
// code
}
我已在单独的程序中对此进行了测试,但它运行良好,但不适用于我正在进行的程序。
以下是我自己程序的摘录。
float chf2 = fmod(chf, 0.1);
float ch3 = chf - chf2;
if (chf2 == 0) {
/* Divide user's number by 0.1 */
float ch3 = chf / 0.1;
/* Round the number */
int ch4 = round(ch3);
/* Print the amount of coins and end */
printf("%d\n", ch4 + coin2);
return 0;
}
奇怪的是,这似乎适用于之前的if语句,用于检查用户输入的fmod为0.25。
有没有更好的方法来检查浮点数是否等于另一个浮点数?
答案 0 :(得分:2)
您的代码正常运行。但是,您的期望可能需要稍微调整一下。
fmod
函数总是返回一个确切的结果---当你写c = fmod(a, b)
时,c
是一个数字,c + k*b
(以无限精度计算)正好等于对于某个整数a
,k
。所以你的代码实际上是正确的--- if (c == 0)
会在a
恰好是b
的倍数时触发。{/ p>
您将b
作为double
0.1
,实际上是分数3602879701896397/36028797018963968
,而不是分数1/10
。因此,如果我计算fmod(1, 0.1)
,我应该得到分数(36028797018963968 % 3602879701896397) / 36028797018963968
,即3602879701896395 36028797018963968
。这比名为double
的{{1}}略小。
这也解释了当您使用0.1
代替0.25
时,您的代码符合您的期望的原因; 0.1
完全给你1/4。
您可以阅读this floating-point guide以了解浮点数的表示。