检查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_f1
和 str_f2
现在是两个简单的字符串,因此您可以轻松地将它们与您想要的小数位数进行比较。
这不完全是你问的,但如果你想确定 float1
和 float2
是否大致相等,在 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;
我想检查一个浮点数是否等于另一个但只有点后的 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_f1
和 str_f2
现在是两个简单的字符串,因此您可以轻松地将它们与您想要的小数位数进行比较。
这不完全是你问的,但如果你想确定 float1
和 float2
是否大致相等,在 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;