33

sに入れる整数がたくさんありますstringstream。ここで、s の精度を一定に保ちながら、 stringstreams をsに変更したいと考えています。どうすればいいですか?を使用できることはわかっていますが、何らかの理由で機能していません。stringstringstringstreams.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

4

2 に答える 2

55

あなたの問題は、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;

これにより、適切な桁数が正しく表示されます。

stringstream関連するメモとして、目標を達成するために 3 つの s を使用する必要はありません。1つだけ使用できます:

std::stringstream t;
t.precision(2);

t << fixed << a << '\n' << b << '\n' << c << '\n';

std::string out = t.str();
于 2011-02-25T03:21:29.563 に答える