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

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

打印

1.23e+045

当使用MS Visual Studio 2003编译时,以及在我的Linux机器上,

1.23e+45

为什么会有差异?我如何指定指数字段的宽度?

3个回答

1
作为@Pieter答案的后续,我一直在查看operator<< (ostream&, double)。实际上,没有字段可以指定指数的显著性或宽度。在Windows上,operator<< 转发到sprintf,但是sprintf也没有指数大小。
转而说,sprintf函数(在Windows上)调用_cfltcvt_l,这是一个我们没有源代码的函数,但其签名不提供指数精度。
我对Linux上的实现一无所知。

1

我认为使用标准操作符不可能实现这一点。(如果可以,我很乐意接受纠正并学习如何实现)

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

这似乎是很多工作,虽然不是火箭科学,但也不是简单的任务。

关于“为什么”的问题:我知道Linux将指数定义为至少两位数字,我想Windows将其定义为至少三位数字?

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

同时添加前导零:

1.230000e+04

你也可以按照这里描述的方法[https://dev59.com/vonda4cB1Zd3GeqPBJjZ#DrXmnYgBc1ULPQZFIKIf]手动计算尾数和指数,然后使用`sprintf`或其他方法。 - Paul Lynn

-1
看一下头文件。它有很多关于宽度、精度等方面的功能。

我需要哪一个?宽度是完整宽度,精度是尾数的数字位数。 - andreas buykx
据我所知,使用默认的iomanip属性是不可能实现的,正如你所说,精度和宽度都有其他作用... - Pieter
@Pieter:我建议你将其作为答案提交,尽管这不是我所希望的答案 =-( - andreas buykx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接