如何设置ostream的指数字段的宽度

How to set the width of the exponent field for an ostream?

本文关键字:指数 数字段 ostream 何设置 设置      更新时间:2023-10-16

此代码:

#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

作为@Pieter答案的后续,我一直在观察运算符内部<lt;(ostream&,双)。实际上,没有字段可以指定指数的重要性或宽度。在窗口上,运算符<lt;前进到sprintf,它也没有指数大小。

反过来,sprintf函数(在Windows上)调用_cfltcvt_l,我们没有该函数的源代码,但其签名不提供指数精度。

我对Linux上的实现一无所知。

查看iomanip标头。它有很多宽度精度等…功能。