web-dev-qa-db-ja.com

printf変数に渡された精度(10進数)のfloat値

小数点以下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のフォーマット文字列を作成できますが、もっと簡単な方法があるかどうか疑問に思っています。

6
Paolo

".*"を使用します

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である。 負のフィールド幅は「-」フラグと見なされ、その後に正のフィールド幅が続きます。存在しない、または小さいフィールド幅によって、の切り捨てが発生することはありません。フィールド;変換の結果がフィールド幅よりも広い場合、フィールドは変換結果を含むように展開されます。

11
Hugo Rivera