double 値を文字列に変換する際に、最大 10 個の小数点値が保持されるようにしたいと考えています。
%e または %f を試したところ、小数点以下 5 桁までしか保持されません。%.14f を試したところ、小さな値 (1.0e-20 未満) は正しく文字列に変換されませんでした。
double 値の小数点以下 10 桁を保持するために使用する書式文字列は?
double 値を文字列に変換する際に、最大 10 個の小数点値が保持されるようにしたいと考えています。
%e または %f を試したところ、小数点以下 5 桁までしか保持されません。%.14f を試したところ、小さな値 (1.0e-20 未満) は正しく文字列に変換されませんでした。
double 値の小数点以下 10 桁を保持するために使用する書式文字列は?
%.17g
問題のダブルに最も適切な形式で印刷してみてください。
printf("%.17g\n", 10000.);
printf("%.17g\n", 240.0008);
printf("%.17g\n", 0.0000000013);
10000
240.0008
1.3000000000000001e-009
型 (単精度浮動小数点)が6 桁の精度しか保持しないことをご存知でしょうか? 変換指定子は、そもそもそこにない精度を与えることはできません... (型は約 15 桁の精度を保持します、FYI.)float
double
リンク: http://en.wikipedia.org/wiki/Floating_point#Internal_representation
更新: JasonD は更新された質問に対する回答を持っています。後世のためにこれを維持します。
浮動小数点数は、数値が小さい場合にのみこの 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;
}