[英]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_f1
和str_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.