2009-11-23 6 views
13

で倍精度が検討:上記のコードで「はsprintf」:C

double a = 0.0000005l; 
char aa[50]; 
sprintf(aa, "%lf", a); 
printf("%s", aa); 

Output: s0.000000 

は、変数aaはわずか6小数精度を含有することができます。私は "s0.0000005"のような出力を得たいと思います。これをどのように達成するのですか?

+2

FYI、0.0000005lは「long double」で、double型の定数には0.0000005を使用します。 – progrmr

+0

すでに回答済み:http://stackoverflow.com/questions/69743/how-to-use-f-to-populate-a-double-value-into-a-string-with-the-right-precision – progrmr

答えて

22

を、あなたが二重のための%lfを使用していたとして、そうです。

置き換える所望の出力を達成するために一般的な構文"%A.B"は小数点以下Bの数字を使用することを意味

sprintf(aa, "%0.7f", a); 

sprintf(aa, "%lf", a); 

Aの意味はより複雑ですが、hereについて読むことができます。

+9

''%A.B "' _は、小数点の前の 'A'数字を意味しません。 'A'は_"フィールド幅 "_です。これは、印刷された番号全体の最小文字幅です。出力には、必要に応じてスペースが(デフォルトで)埋められます。 – chux

+1

なぜこの答えが 'lf'から' f'に切り替わるのか分かりません。 'lf'は' double'のための完全に適切な書式指定子です。さらに、C99では 'fscanf'と' fprintf'の書式指定子間の矛盾した矛盾を修正するために特に合法化されました。つまり、 'lf'は' double'値の 'f'より優先されるべきです。 'f'は' float'のためのものです。 – AnT

5

あなたはフォーマットコードにいくつかの詳細はhttp://en.wikipedia.org/wiki/Printfをチェックsprintf(aa, "%9.7lf", a)

のようにそれを記述する必要があります。

+2

%lf長いダブルです。ダブルには9.7f%を使用してください。 – progrmr

+2

@ kk6yb: '%lf'はC89では定義されておらず、C99では'%f'と同じです(両方とも 'double'値を出力するのに適しています)。 long doubleの場合、正しい変換指定子は '%Lf'です。 – pmg

+1

もっと正確に言えば、 ''%X.Yf''では、表示する小数点以下の桁数(デフォルトは6)を表し、' X'は表示する最小文字数を表します。あなたの場合、 'X'は必要ではありませんが、印刷する小数点以下の桁数を' Y'とする '.Y'を追加する必要があります。 – bta

-1

問題はsprintfのである

sprintf(aa,"%lf",a); 

% LFは "" "長いダブル"(16バイト)とをinterpetすると言うが、それは実際には "ダブル"(8バイト)です。代わりにこれを使用する:あなたはC99を使用しているようなあなたの質問から

sprintf(aa, "%f", a); 

詳細here on cplusplus.com

+1

'%lf'はC89では定義されておらず、C99では'%f'と同じです。 long doubleの場合、正しい変換指定子は '%Lf'です。 – pmg

+0

これは小数点以下6桁を出力するため、0.000001ではなく0.000000が印刷される可能性が最も高くなります。 "%9.7f"を使用すると小数点第7位が正しくなります。 –

+0

ええ、私は小数点以下に注意を払っていませんでした。ポイントは '%lf'はC99で' double'を期待しています。 '%Lf'は' long double'を期待しています。 – pmg