首页 > 解决方案 > c++科学记数法,改变指数的位数

问题描述

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

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

例如,如果数字是 3.0,我从代码中得到 3.0000000000E+00。如何将指数部分的数字设为 3 位?我想得到 3.0000000000E+000。

标签: c++scientific-notation

解决方案


正如@Bob__ 所说,Visual Studio 曾经有一个名为:的函数_set_output_format,它允许您更改指数,我相信这已在 Visual Studio 2015 版本中删除。

如Portable printing of a double to C++ iostreams 中所引用。

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

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

因此,如果您真的想用 3 位指数编写,为了解决您的问题,需要修改输出。您可以通过将双精度转换为字符串来实现,例如:

#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()将返回一个您尝试打印的双精度字符串,您可以对其进行修改,以便为您的指数添加一个额外的数字。


推荐阅读