std::setprecisionマニピュレータ
入出力ストリームで浮動小数点型の桁数を指定したい場合はsetprecision
マニピュレータを使います。<iomanip>
ヘッダーをインクルードする必要があります。
// #include <iomanip>
std::cout << std::setprecision(2) << 3.141; // "3.1"
第一引数に浮動小数点数出力時の精度を指定することができます。
注意点
桁数として2
を指定しましたが、表示される結果は3.14
ではなく3.1
となります。整数部も桁数に含まれてしまう点に注意してください。
整数部の桁数が指定した桁数以上の場合、小数部は出力されなくなります。
std::cout << std::setprecision(2) << 12.3; // "12"
また小数部のゼロ埋めがされない点にも注意が必要です。
std::cout << std::setprecision(2) << 3.0; // "3" (3.0ではない)
std::fixed(少数点数表記によるフォーマット)
小数部の桁数をより正確に指定したい場合には書式フラグfixed
を使用します。これにより少数点数表記による出力が行われるようになります。小数点以下の桁数は固定の長さとなります。
std::cout << std::fixed;
std::cout << std::setprecision(2) << 3.141; // "3.14"
std::cout << std::setprecision(2) << 3.0; // "3.00"
printf関数の%f
によるフォーマットに相当します。
std::defaultfloat(デフォルトの状態によるフォーマット)
書式を初期状態に戻す場合はdefaultfloat
フラグを使用します。
std::cout << std::defaultfloat;
std::cout << 0.0001; // "0.0001"(小数点数表記)
std::cout << 0.00001; // "1e-05" (指数表記)
defaultfloatによるデフォルトの状態では、値の桁数に応じて指数表記による出力が行われる場合があります。このフォーマットはprintf関数の%g
に相当します。
std::scientific(指数表記によるフォーマット)
指数表記による出力を行いたい場合にはscientific
を用います。printf関数の%e
に相当するフォーマットとなります。
std::cout << std::scientific << 0.1; // "1.000000e-01"
デフォルトの精度について
標準では float型/double型 共に6桁で出力されます(Clangコンパイラの場合)。
std::cout << 3.1415926535; // "3.14159"
この精度はprecisionメンバ関数の値に依存しています。
std::streamsize precision = std::cout.precision();
printf("%td\n", precision); // "6"
std::cout << std::setprecision(2);
printf("%td\n", std::cout.precision()); // "2"
std::cout << 3.141421356; // "3.1"
std::cout.precision(precision);
std::cout << 3.141421356; // "3.14142"
なおstd::setprecision(int)
マニピュレータによる精度指定は、std::ios_base::precision(std::streamsize)
メンバ関数による指定に相当する処理となります。