std :: stringstream的小数点?

时间:2011-02-25 03:17:48

标签: c++ string floating-point stringstream iomanip

我在stringstream中添加了一堆整数。现在我想将stringstream更改为string s,同时保持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

2 个答案:

答案 0 :(得分:45)

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

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();

答案 1 :(得分:3)

在 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);

同时您可以使用 the {fmt} librarystd::format 基于 (godbolt)。

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