C++中对stringstream、setw和setprecision的困难

huangapple go评论89阅读模式
英文:

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
  1. 为什么像-8.28.4这样的值被四舍五入了?
  2. 为什么零值没有被格式化?

我期望的输出是这样的:

   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 &lt;typename T&gt;
std::string format(std::vector&lt;T&gt; &amp;a, int m, int n, int lda)
{
    std::stringstream ss;
    for (int i = 0; i &lt; m; i++)
    {
        for (int j = 0; j &lt; n; j++)
        {
            ss &lt;&lt; std::setw(6);
            ss &lt;&lt; a[i + j * lda];
            ss &lt;&lt; std::setprecision(2);
        }
        if (i &lt; m - 1)
            ss &lt;&lt; std::endl;
    }
    return ss.str();
}

int main()
{
    const int LDA = 5;
    const int N = LDA;

    std::vector&lt;double&gt; 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 &lt;&lt; format(a, N, N, LDA) &lt;&lt; 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
  1. Why are values like -8.2, 8.4 rounded?
  2. 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 &lt;typename T&gt;
std::string format(std::vector&lt;T&gt; &amp;a, int m, int n, int lda) {
    std::stringstream ss;
    
    ss &lt;&lt; std::fixed &lt;&lt; std::setprecision(2);    // &lt;- here

    for (int i = 0; i &lt; m; i++) {
        for (int j = 0; j &lt; n; j++) {
            ss &lt;&lt; std::setw(6) &lt;&lt; a[i + j * lda];
        }
        if (i &lt; m - 1) ss &lt;&lt; &#39;\n&#39;; // std::endl; is pointless
    }
    return ss.str();
}

Demo

huangapple
  • 本文由 发表于 2023年6月15日 05:35:45
  • 转载请务必保留本文链接:https://go.coder-hub.com/76477705.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定