C - 比较浮点数和 if 语句

C - Comparing floats with if statements

我目前正在写一个贪心算法,但是我在比较浮点数时偶然发现了一个问题。

我会使用这样的代码:

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。

有没有更好的方法来检查一个浮点数是否等于另一个浮点数?

您的代码工作正常。但是,您的期望可能需要稍微调整一下。

fmod 函数总是 returns 一个精确的结果---当你写 c = fmod(a, b) 时,c 是一个数字,使得 c + k*b(计算无限精度)对于某个整数 k 正好等于 a。所以你的代码实际上是正确的---if (c == 0) 将在 a 恰好是 b.

的倍数时触发

你把b当成了double0.1,其实是分数3602879701896397/36028797018963968,不是分数1/10。因此,如果我计算 fmod(1, 0.1),我应该期望得到分数 (36028797018963968 % 3602879701896397) / 36028797018963968,即 3602879701896395 36028797018963968。这比称为 0.1double 略小。

这也解释了为什么当您使用 0.25 而不是 0.1 时,您的代码符合您的期望; 0.25 正好给你 1/4。

您可以阅读 this floating-point guide 以了解浮点数的表示。