1

我正在尝试比较两个字符串,但我没有做到这一点。为什么?

#include <stdio.h>
#include <string.h>

int main(){
    float a = 1231.23123;
    char b[32];
    sprintf(b, "%f", a);
    printf("%s\n", b);
    char c[32] = "1231.23123";
    if (strcmp(c, b) == 0){
        printf("SUCCES\n");
    }
    else{
        printf("DIFFER\n");
    }
    return 0;
}

结果:

1231.231201
DIFFER
4

4 回答 4

10

这两个字符串明显不同,因此strcmp()工作正常。

问题是1231.23123不能表示为float. 实际上,可以表示为 a的最接近的数字float1231.231201171875,这就是您所看到的(四舍五入sprintf()到小数点后六位)。

于 2013-03-15T11:03:39.783 回答
4

如果您想在字符串中比较一组数字,请使用sprintf-中的精度说明符%.5f,正如其他人指出的那样,您选择的数字不能用 a 表示float,但可以用 a 表示double。IE

double a = 1231.23123;
char b[32];
sprintf(b, "%.5f",a);
于 2013-03-15T11:09:42.550 回答
3

这是因为浮点数的精度不能支持这么多位数。所以 b 不是“1231.23123”。在我的测试中,它是“1231.231201”。

于 2013-03-15T10:59:44.653 回答
2

您在这里比较这两个字符串:

1231.23123
1231.231201

它们确实不同,因此strcmp返回非零值。

这里的实际问题是,当您这样做时float a = 1231.23123;,您要存储的数字a不能表示为 a ,在这种情况下可以表示为 a的float最接近的数字。看看OMG 小马!!!(又名人类:史诗般的失败);)float1231.231201171875


为了解决您的问题,我将从使用double而不是float获得更精确的准确性开始。然后,您可以在将此数字打印到字符串中时指定精度 ( %.5lf),以确保该数字像您需要的那样四舍五入:

double d = 1231.23123;
char str[32];
sprintf(str, "%.5lf", d);
// strcmp(str, "1231.23123") would return 0 here
于 2013-03-15T11:06:11.253 回答