web-dev-qa-db-ja.com

std :: stringstreamを使用した小数点?

stringstreamsに入れた整数の束があります。ここで、stringstreamsで精度を一定に保ちながら、stringsをstringsに変更します。どうすればいいですか? 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

27
noobcpp

あなたの問題は、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つのstringstreamsを使用する必要はありません。 1つだけ使用できます。

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

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

std::string out = t.str();
45
templatetypedef