3

double 値を文字列に変換する際に、最大 10 個の小数点値が保持されるようにしたいと考えています。

%e または %f を試したところ、小数点以下 5 桁までしか保持されません。%.14f を試したところ、小さな値 (1.0e-20 未満) は正しく文字列に変換されませんでした。

double 値の小数点以下 10 桁を保持するために使用する書式文字列は?

4

3 に答える 3

6

%.17g問題のダブルに最も適切な形式で印刷してみてください。

printf("%.17g\n", 10000.);
printf("%.17g\n", 240.0008);
printf("%.17g\n", 0.0000000013);

10000
240.0008
1.3000000000000001e-009
于 2012-12-18T10:41:36.150 に答える
2

型 (単精度浮動小数点)が6 桁の精度しか保持しないことをご存知でしょうか? 変換指定子は、そもそもそこにない精度を与えることはできません... (型は約 15 桁の精度を保持します、FYI.)floatdouble

リンク: http://en.wikipedia.org/wiki/Floating_point#Internal_representation

更新: JasonD は更新された質問に対する回答を持っています。後世のためにこれを維持します。

于 2012-12-18T10:39:34.743 に答える
1

浮動小数点数は、数値が小さい場合にのみこの 10 進数を格納できます。それ以外の場合は double を使用します。

この例%.17g%.14fは、問題なく動作しています:

#include <stdio.h>

int main(void)
{
        double v = 0.12345678912345;
        printf("%.17g   %.14f  \n", v, v);
        return 0;
}

表示結果:

0.12345678912345   0.12345678912345

ドキュメントから

f : 10 進浮動小数点、小文字 392.65

e : 指数表記 (仮数/指数)、小文字 3.9265e+2

g : 最も短い表現を使用: %e または %f 392.65

だから使っ%.14fて大丈夫

編集:

小さな値 (1.0e-20 未満) は文字列に正しく変換されません。

20 を超える 10 進数を表示するには、long double を使用する必要があります。ただし、1.0e-20 のみを格納する必要があり、6 を超える 10 進数を出力する必要がない場合は、float で保持できます。

long double の場合は、 のようなものを使用する必要があります%.21Lg。例えば ​​:

#include <stdio.h>

int main(void)
{
        long double v = 0.123456789123456789123456789;
        printf("%.21Lg   %.21Lf   \n", v, v);
        return 0;
}
于 2012-12-18T10:39:46.077 に答える