1

2つの文字列を比較しようとしていますが、それを達成できません。なんで?

#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

2つの文字列は明らかに異なるため、正常にstrcmp()機能しています。

問題は、1231.23123として表現できないことfloatです。実際、 aとして表すことができる最も近い数値float1231.231201171875、です。これは、表示されている数値です(小数点以下6桁に丸められますsprintf())。

于 2013-03-15T11:03:39.783 に答える
4

文字列内で設定された桁数と比較する場合は、sprintf-の精度指定子を使用します%.5f。他の人が指摘しているように、選択した数値は、で表すことはできませんが、で表すfloatことができますdouble。すなわち

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

これは、floatの精度がそれほど多くの桁をサポートできないためです。したがって、bは「1231.23123」ではありません。私のテストでは、「1231.231201」です。

于 2013-03-15T10:59:44.653 に答える
2

ここでは、これら2つの文字列を比較しています。

1231.23123
1231.231201

これは実際には異なり、したがってstrcmpゼロ以外の値を返します。

ここでの実際の問題は、を実行するfloat a = 1231.23123;と、格納する数値を、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 に答える