Десятичные точки с помощью std :: stringstream? - PullRequest
25 голосов
/ 25 февраля 2011

У меня есть набор целых чисел, которые я положил в stringstream с.Теперь я хочу изменить stringstream с на string с, сохраняя при этом постоянную точность с string с.Как бы я это сделал?Я знаю, что могу использовать 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

1 Ответ

45 голосов
/ 25 февраля 2011

Я думаю, что ваша проблема в том, что precision() устанавливает точность, используемую в будущих операциях вставки потока, а не при генерации последней строки для представления.То есть, записывая

ta << a;
tb << b;
tc << c;

ta.precision(2);
tb.precision(2);
tc.precision(2);

Вы устанавливаете precision слишком поздно, поскольку первые три строки уже преобразовали числа с плавающей запятой в строки с точностью по умолчанию.

Toисправьте это, попробуйте изменить порядок выполнения этих операторов на

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 с для достижения вашей цели.Вы можете просто использовать один:

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

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

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