繁体   English   中英

检查 float 是否等于 C 中点后的另一个 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

您对这两个变量进行的任何计算都可能会更改小数值。 所以要避免计算。

而是使用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;
}

Output:

1.234560012817382812500000000000000000000000000000000000000000...
1.234570026397705078125000000000000000000000000000000000000000...

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

执行此操作的通常方法是将两个数字相减,并查看差异是否小于阈值。 (当然,您必须考虑绝对值。)因此,对于三位数字,如下所示:

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;

你可以这样做:

#include <math.h>

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM