stringstream
sに入れた整数の束があります。ここで、stringstream
sで精度を一定に保ちながら、string
sをstring
sに変更します。どうすればいいですか? stringstreams.precision()
を使用できることはわかっていますが、何らかの理由で機能しません。
float a = 5.23;
float b = 3.134;
float c = 3.0;
std::stringstream ta;
std::stringstream tb;
std::stringstream tc;
ta << a;
tb << b;
tc << c;
ta.precision(2);
tb.precision(2);
tc.precision(2);
std::string out = "";
out += ta.str() + "\n";
out += tb.str() + "\n";
out += tc.str() + "\n";
戻ります 5.23\n3.134\n3.0
、 のではなく 5.23\n3.13\n3.00
あなたの問題は、precision()
が、提示する最終的な文字列を生成するときではなく、将来のストリーム挿入操作で使用される精度を設定することだと思います。つまり、
ta << a;
tb << b;
tc << c;
ta.precision(2);
tb.precision(2);
tc.precision(2);
最初の3行でデフォルトの精度を使用して浮動小数点数が文字列にすでに変換されているため、precision
を設定するのが遅すぎます。
これを修正するには、これらのステートメントを実行する順序を次のように変更してみてください
ta.precision(2);
tb.precision(2);
tc.precision(2);
ta << a;
tb << b;
tc << c;
これにより、stringstream
への書き込みで、既存のデフォルトではなくカスタム精度が使用されます。
ただし、precision
修飾子の効果は、出力に固定精度表記または科学表記のいずれかを使用することをストリームに明示的に指示した場合にのみ意味があります。これを行うには、fixed
またはscientific
修飾子を使用できます。
ta.precision(2);
tb.precision(2);
tc.precision(2);
ta << fixed << a;
tb << fixed << b;
tc << fixed << c;
これにより、適切な桁数が正しく表示されます。
関連するメモとして、目標を達成するために3つのstringstream
sを使用する必要はありません。 1つだけ使用できます。
std::stringstream t;
t.precision(2);
t << fixed << a << '\n' << b << '\n << c << '\n';
std::string out = t.str();