33

我有一堆整数放入stringstreams 中。现在我想将stringstreams 更改为strings,同时保持 s 的恒定精度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

4

2 回答 2

55

我认为您的问题是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只有当您明确告诉流您要使用固定精度或科学记数法进行输出时,修饰符的效果才有意义。为此,您可以使用fixedorscientific修饰符:

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

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

这将正确显示适当的位数。

在相关说明中,您不需要使用三个stringstreams 来实现您的目标。你可以只使用一个:

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 回答
4

在 C++20 中,您可以使用std::format哪种方式更高效且不那么冗长std::stringstream

float a = 5.23;
float b = 3.134;
float c = 3.0;
std::string out = std::format("{:.2f}\n{:.2f}\n{:.2f}\n", a, b, c);

同时您可以使用基于 ( godbolt )的 {fmt} 库std::format

免责声明:我是 {fmt} 和 C++20 的作者std::format

于 2021-03-03T04:07:35.057 回答