检查float是否等于C中dot之后的另一个X数字

Check if float is equal to another X number after dot in C

我想检查一个浮点数是否等于另一个但只有点后的 X 数字。 对于 X = 3: 0.1234 == 0.1235

if (float1.X == float2.X)
      do something
else
      do something

你可以这样做:

#include <math.h>

int compare(float float1, float float2, int decimals) {
    double n = pow(10, decimals);
    return (int)(float1 * n) == (int)(float2 * n);
}

但请记住,根据浮点标准的定义,不保证浮点值的十进制表示从一开始就是准确的。

浮点计算不精确可能会导致令人惊讶的舍入错误:因此我建议您在比较小数部分之前避免进行浮点计算。 而是使用 sprintf 将值打印为字符串。然后比较两个字符串中你想要的小数位数。确保使用足够大的宽度说明符以避免意外舍入。对于 IEEE 754 32 位浮点数,最大小数位数将略小于 150。

开始于:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    float f1 = 1.23456;
    float f2 = 1.23457;
    char str_f1[512];
    char str_f2[512];
    sprintf(str_f1, "%.160f", f1);
    printf("%s\n", str_f1);
    sprintf(str_f2, "%.160f", f2);
    printf("%s\n", str_f2);

    // Add code for string compare using X decimals
    
    return 0;
}

输出:

1.234560012817382812500000000000000000000000000000000000000000...
1.234570026397705078125000000000000000000000000000000000000000...

所以 str_f1str_f2 现在是两个简单的字符串,因此您可以轻松地将它们与您想要的小数位数进行比较。

这不完全是你问的,但如果你想确定 float1float2 是否大致相等,在 X 有效数字范围内,通常的方法是这样做就是将两个数相减,看差值是否小于一个阈值。 (当然,你必须考虑绝对值。)因此,对于三位有效数字,如下所示:

if(fabs(float1 - float2) < 0.001)
    do something;
else
    do something else;

或者,用变量 X:

if(fabs(float1 - float2) < pow(10, -X))
    do something;
else
    do something else;