2008-11-06 51 views
6

此代码:如何设置ostream的指数字段的宽度?

#include <iostream> 
int main(int, char **argv) 
{ 
std::cout << 1.23e45 << std::endl; 
} 

打印

1.23E + 045

当与MS Visual Studio 2003中编译,并

1.23E + 45

在我的Linux机器上。

如何指定指数字段的宽度(以及为什么第一个地方存在差异)?

回答

1

我不认为这是可能的标准操纵器。 (如果是的话,我希望被纠正,并学习如何)

你唯一剩下的选择是自己创建一个streambuf,并拦截所有指向数据流的指数,手工重新格式化它们并将它们传递给到底层的流。

似乎很多工作,虽然不是火箭科学,但也不是微不足道的任务。

关于'为什么'的问题:我知道linux将指数定义为最小两位数,我想Windows将它指定为最小三位?

// on linux 
std::cout << std::scientific << 1.23e4 << std::endl 

还增加了一个前导零:

1.230000e+04 
-1

调查iomanip标题。它具有很多宽度精度等功能。

+0

我需要哪一个?宽度是全宽度,精度是尾数的位数。 – 2008-11-06 13:26:35

1

正如@彼得的回答的后续,我一直在寻找运营商内部< <(ostream的&,双)。事实上,没有字段可以指定指数的显着性或宽度。在窗口上,运营商< <转发到sprintf,它也没有指数大小。

接下来,sprintf函数(在Windows上)调用_cfltcvt_l,这是一个我们没有源代码的函数,但是它的签名没有提供指数精度。

我对Linux的实现一无所知。