1

浮動小数点変数を ini ファイルに書き込もうとしていますが、フォーマット指定子で問題が発生しました。float 値があります。101.9716 とします。今、私はそれを自分のiniファイルに書きたいのですが、問題は、精度の低い別のfloat値(15.85など)があり、その値が同じループでiniファイルに書き込まれていることです。私もです:

sprintf(valLineY, "%g", grade[i].yArr[j]);

私の他のすべての変数は、「20」(20.00000の場合)、「13.85」(13.850000の場合)などのような素敵な文字になります。しかし、なぜか101.9716が「101.972」になってしまいます。なぜこれが起こるのか、そして私のイデオロギーを台無しにせずに「101.9716」にする方法を教えてください。助けてくれてありがとう。

4

1 に答える 1

4

なぜこれが起こるのですか?

私はテストしました:

double f = 101.9716;
printf("%f\n", f);
printf("%e\n", f);
printf("%g\n", f);

そしてそれは出力します:

101.971600
1.019716e+02 // Notice the exponent +02
101.972

C標準(N1570 7.21.6.1)が変換指定子について述べていることは次のとおりですg

double浮動小数点数を表す引数は、変換された値と精度に応じて、スタイルor (G 変換指定子の場合はスタイル or ) で変換さfeますFEPは、非ゼロの場合は精度、精度が省略されている場合は 6、精度がゼロの場合は 1 と等しくなります次に、スタイルを使用した変換Eの指数がXの場合:

P > X ≥ −4の場合、変換はスタイルf(またはF) および精度 P − (X + 1)で行われます。

— それ以外の場合、変換はスタイルe(またはE) と精度P − 1で行われます。

上記のように、Pは精度が指定されていないため 6 に等しくなり、Xは style の指数であるため 2 に等しくなりeます。

したがって、式6 > 2 >= -4が成り立ち、スタイルfが選択されます。精度6 - (2 + 1) = 3になります。

直し方?

とは異なり、精度が設定されている場合でもf、stylegは不要なゼロを削除します。

最後に、#フラグを使用しない限り、結果の小数部分から末尾のゼロが削除され、小数部分が残っていない場合は小数点文字が削除されます。

したがって、十分に高い精度を設定します。

printf("%.8g\n", f);

プリント:

101.9716
于 2016-02-18T08:51:00.830 に答える