首先使用double进行setw左对齐,然后右对齐

时间:2014-03-20 21:41:09

标签: c++ stream double

我试图肯定我的知识,关于溪流如何与双打和各种操纵者一起工作,并偶然发现G ++做了一些奇怪的事情:

int main() {
    double v = 10.0/3.;
    //std::cout << v << '\n';
    std::cout << std::setw(5) << std::setprecision(2) << v << '\n';
    std::cout << std::setw(5) << std::setprecision(2) << std::fixed << v << '\n';
}

输出:

3.3      //why is this left aligned?
 3.33    //why is this right aligned? which is right?

See it live here

然后我取消评论第一个cout并得到不同的结果!

3.33333 //which alignment is this?
  3.3   //now this is right aligned?!
 3.33   //that implies right-aligned is correct

后续测试显示第一个双流输出是左对齐的,所有后续双精度都是右对齐的:

double v = 10.0/3.;
std::cout << std::setw(10) << v << '\n';
std::cout << std::setw(5) << std::setprecision(2) << std::fixed << v << '\n';
std::cout << std::setw(5) << std::setprecision(2) << v << '\n';
std::cout << std::setw(5) << std::setprecision(2) << v << '\n';

输出:

3.33333           //well, this is left aligned
 3.33
  3.3           
  3.3             //all subsequent tests are right aligned

Coliru上的Clang ++正在做同样的事情,我认为是因为他们使用相同的库。

我知道“这是一个G ++错误”的答案不是99.9%,所以有人可以解释我所看到的行为吗?

1 个答案:

答案 0 :(得分:2)

在其他IDE上运行后,我会得出结论,这不是g ++ / clang ++的问题,也不是任何标准行为,而是Coliru编辑器本身的问题。我在几个不同的网站上运行了这个,包括RextesterIdeone,我得到了所有这些网站的正确输出。这似乎只是属于Coliru编辑的问题。

默认情况下,Streams是右对齐的。使用std::setw()设置宽度时,流会将out.fill()指定的填充字符插入输出流的开头(或结尾)。我注意到当流使用默认填充字符(简单空格)时,Coliru不会在第一个输出操作中添加任何填充字符。但是当我将填充字符更改为空格以外的任何内容时,it works就好了。