#include <iostream>
int main(int, char **argv)
{
std::cout << 1.23e45 << std::endl;
}
打印
1.23E + 045
当与MS Visual Studio 2003中编译,并
1.23E + 45
在我的Linux机器上。
如何指定指数字段的宽度(以及为什么第一个地方存在差异)?
#include <iostream>
int main(int, char **argv)
{
std::cout << 1.23e45 << std::endl;
}
打印
1.23E + 045
当与MS Visual Studio 2003中编译,并
1.23E + 45
在我的Linux机器上。
如何指定指数字段的宽度(以及为什么第一个地方存在差异)?
我不认为这是可能的标准操纵器。 (如果是的话,我希望被纠正,并学习如何)
你唯一剩下的选择是自己创建一个streambuf,并拦截所有指向数据流的指数,手工重新格式化它们并将它们传递给到底层的流。
似乎很多工作,虽然不是火箭科学,但也不是微不足道的任务。
关于'为什么'的问题:我知道linux将指数定义为最小两位数,我想Windows将它指定为最小三位?
// on linux
std::cout << std::scientific << 1.23e4 << std::endl
还增加了一个前导零:
1.230000e+04
调查iomanip标题。它具有很多宽度精度等功能。
正如@彼得的回答的后续,我一直在寻找运营商内部< <(ostream的&,双)。事实上,没有字段可以指定指数的显着性或宽度。在窗口上,运营商< <转发到sprintf,它也没有指数大小。
接下来,sprintf函数(在Windows上)调用_cfltcvt_l,这是一个我们没有源代码的函数,但是它的签名没有提供指数精度。
我对Linux的实现一无所知。
我需要哪一个?宽度是全宽度,精度是尾数的位数。 – 2008-11-06 13:26:35