英文:
C++ difficulties with stringstream, setw and setprecision
问题
以下是您提供的代码的中文翻译:
我试图使用`stringstream`、`setw`和`setprecision`来格式化矩阵。 代码如下:
template <typename T>
std::string format(std::vector<T> &a, int m, int n, int lda)
{
std::stringstream ss;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
ss << std::setw(6);
ss << a[i + j * lda];
ss << std::setprecision(2);
}
if (i < m - 1)
ss << std::endl;
}
return ss.str();
}
int main()
{
const int LDA = 5;
const int N = LDA;
std::vector<double> a = {
6.39, 0.00, 0.00, 0.00, 0.00,
0.13, 8.37, 0.00, 0.00, 0.00,
-8.23, -4.46, -9.58, 0.00, 0.00,
5.71, -6.10, -9.25, 3.72, 0.00,
-3.18, 7.21, -7.42, 8.54, 2.51};
std::cout << format(a, N, N, LDA) << std::endl;
return 0;
}
输出结果如下:
6.39 0.13 -8.2 5.7 -3.2
0 8.4 -4.5 -6.1 7.2
0 0 -9.6 -9.2 -7.4
0 0 0 3.7 8.5
0 0 0 0 2.5
- 为什么像
-8.2
、8.4
这样的值被四舍五入了? - 为什么零值没有被格式化?
我期望的输出是这样的:
6.39 0.13 -8.23 5.71 -3.18
0.00 8.37 -4.46 -6.10 7.21
0.00 0.00 -9.58 -9.25 -7.42
0.00 0.00 0.00 3.72 8.54
0.00 0.00 0.00 0.00 2.51
如何正确格式化它?
英文:
I was trying to format a matrix using stringstream
, setw
and setprecision
. The code looks like this:
template <typename T>
std::string format(std::vector<T> &a, int m, int n, int lda)
{
std::stringstream ss;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
ss << std::setw(6);
ss << a[i + j * lda];
ss << std::setprecision(2);
}
if (i < m - 1)
ss << std::endl;
}
return ss.str();
}
int main()
{
const int LDA = 5;
const int N = LDA;
std::vector<double> a = {
6.39, 0.00, 0.00, 0.00, 0.00,
0.13, 8.37, 0.00, 0.00, 0.00,
-8.23, -4.46, -9.58, 0.00, 0.00,
5.71, -6.10, -9.25, 3.72, 0.00,
-3.18, 7.21, -7.42, 8.54, 2.51};
std::cout << format(a, N, N, LDA) << std::endl;
return 0;
}
The output looks like this:
6.39 0.13 -8.2 5.7 -3.2
0 8.4 -4.5 -6.1 7.2
0 0 -9.6 -9.2 -7.4
0 0 0 3.7 8.5
0 0 0 0 2.5
- Why are values like
-8.2
,8.4
rounded? - Why aren't zeros formatted?
I was expecting an output like this:
6.39 0.13 -8.23 5.71 -3.18
0.00 8.37 -4.46 -6.10 7.21
0.00 0.00 -9.58 -9.25 -7.42
0.00 0.00 0.00 3.72 8.54
0.00 0.00 0.00 0.00 2.51
How do I format it correctly?
答案1
得分: 2
你需要将 std::setprecision(2)
移到开始打印之前,否则第一个值将具有默认精度。这个设置会一直有效,直到你用其他内容替换它,所以你只需要做一次。
你还需要将流设置为 std::fixed
模式。
示例:
template <typename T>
std::string format(std::vector<T> &a, int m, int n, int lda) {
std::stringstream ss;
ss << std::fixed << std::setprecision(2); // <- 这里
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
ss << std::setw(6) << a[i + j * lda];
}
if (i < m - 1) ss << '\n'; // std::endl; 是无意义的
}
return ss.str();
}
英文:
You need to move std::setprecision(2)
to before you start printing, otherwise the first value will have the default precision. This setting is active until you replace it with something else, so you only need to do it once.
You also need to set the stream in std::fixed
mode.
Example:
template <typename T>
std::string format(std::vector<T> &a, int m, int n, int lda) {
std::stringstream ss;
ss << std::fixed << std::setprecision(2); // <- here
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
ss << std::setw(6) << a[i + j * lda];
}
if (i < m - 1) ss << '\n'; // std::endl; is pointless
}
return ss.str();
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论