小数点以下3桁の精度で浮動小数点値を出力できます。
double f = 1.23456;
printf( "%.3f", f );
これで、要求された10進数の数が固定されていませんが、変数に格納されています。
int precision;
precision = atoi( argv[ 1 ] ); // ...just for example
double f = 1.23456;
f
で指定された10進数の桁数でprecision
の値を出力するにはどうすればよいですか?
プログラムでprintf
のフォーマット文字列を作成できますが、もっと簡単な方法があるかどうか疑問に思っています。
".*"
を使用します
printf("%.*f", precision, f);
例:
>>> printf("%.*f", 5, 3.14)
"3.14000"
これは精度フィールドと呼ばれます。 manページ によると、
精度:オプションの精度。ピリオド( '。')の後にオプションの10進数の文字列が続きます。 10進数の文字列の代わりに、「*」または「* m $」(一部の10進整数mの場合)を記述して、精度が次の引数またはm番目の引数にそれぞれ指定されるように指定できます。タイプintの。 精度が「。」として指定されている場合、または精度が負の場合、精度はゼロと見なされます。これにより、d、i、o、u、x、およびX変換で表示される最小桁数、a、A、e、E、f、およびF変換で基数文字の後に表示される桁数がわかります。 gおよびG変換の場合は有効桁の最大数、またはsおよびS変換の場合は文字列から出力される最大文字数。
幅フィールドも同様で、"%*s"
などのより多くの形式で機能します。 .
を削除するだけです。必要に応じて、出力にスペースまたはゼロを埋め込みます。 precision
が負の場合、文字列は左揃えになります。
>>> printf("%*s\n", 10, "left?")
" left?"
>>> printf("%*s\n", -10, "left?")
"left? "
manページ によると、
フィールド幅:最小フィールド幅を指定するオプションの10進数文字列(最初の桁がゼロ以外)。変換された値の文字数がフィールド幅よりも少ない場合は、左側(または、左調整フラグが指定されている場合は右側)にスペースが埋め込まれます。 10進数の文字列の代わりに、「*」または「* m $」(一部の10進整数mの場合)を記述して、フィールド幅が次の引数またはm番目の引数でそれぞれ指定されるように指定できます。タイプintである。 負のフィールド幅は「-」フラグと見なされ、その後に正のフィールド幅が続きます。存在しない、または小さいフィールド幅によって、の切り捨てが発生することはありません。フィールド;変換の結果がフィールド幅よりも広い場合、フィールドは変換結果を含むように展開されます。