Подтвердить что ты не робот

Десятичные точки с std:: stringstream?

У меня есть куча целых чисел, которые я помещал в stringstream s. Теперь я хочу изменить stringstream на string, сохраняя постоянную точность с помощью 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

4b9b3361

Ответ 1

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

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

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

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

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

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

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