Ответ 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();