C++科学计数法,更改指数的数字

3

我正在使用以下代码将科学计数法的数字输出到文件:

file << scientific << setprecision(10) << num << endl;

例如,如果数字是3.0,代码输出结果是3.0000000000E+00。如何将指数部分的数字位数变为3位?我想要得到的结果是3.0000000000E+000。

你使用的是哪个编译器?我认为gcc的标准应该是三位数字。 - darclander
我正在使用Visual Studio。编译器版本是Microsoft (R) C/C++优化编译器版本19.25.28614,适用于x86。 - user3.141592653
相关: https://dev59.com/lF0Z5IYBdhLWcg3wiw0v (如果不是重复问题)。另外: https://dev59.com/VWox5IYBdhLWcg3wazmQ。简而言之,你不能控制指数后的数字,你必须手动修改输出。 - Bob__
@Bob__ 你确定吗?根据这些文档,输出应该有3位数字的指数吧? - darclander
请参考 https://dev59.com/0qvka4cB1Zd3GeqPyL8Y#50620148 ,其中引用了C11标准的内容:“指数始终至少包含两个数字,并且只包括必要表示指数的额外数字。如果值为零,则指数为零。”另外还可以查看:https://dev59.com/VWox5IYBdhLWcg3wazmQ#35738440 - Bob__
显示剩余3条评论
1个回答

1
似乎就像@Bob__所说的那样,Visual Studio曾经有一个名为_set_output_format的函数,它允许您更改指数,但我相信这在Visual Studio 2015版本中被删除了。
正如Portable printing of exponent of a double to C++ iostreams中引用的那样。

%e%E 格式说明符将浮点数格式化为十进制的尾数和指数。在某些情况下,%g%G 格式说明符也以这种形式格式化数字。在之前的版本中,CRT 总是生成带有三位数字指数的字符串。例如,printf("%e\n", 1.0) 将打印出 1.000000e+000。这是不正确的:C 要求如果指数只能用一到两个数字表示,则只打印两个数字。

在 Visual Studio 2005 中,添加了全局一致性开关:_set_output_format。程序可以调用此函数并使用参数 _TWO_DIGIT_EXPONENT,以启用符合要求的指数打印。默认行为已更改为符合标准的指数打印模式。

因此,如果您确实想要使用三位数字指数编写内容,则需要修改输出。您可以通过将双精度浮点数转换为字符串来实现,例如:

#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>


std::string getStrCpy(double dbl) {
    std::ostringstream str;
    str << std::scientific << std::setprecision(10) << dbl;
    std::string s = str.str();
    std::cout << s; // Prints 3.0000000000e+00
    return s;
}

int main() {

    double d = 3.0;
    std::cout.precision(10);
    std::cout << std::scientific;

    std::cout << d << '\n'; // Prints 3.0000000000e+00
    getStrCpy(d); // Will also print 3.0000000000e+00

    return 0;
}

现在getStrCpy()将返回一个字符串,其中包含您尝试打印的double值,您可以修改该字符串以添加额外的数字到指数。

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