c++ - 使用 C++ 打印带有一个前导零的指数符号

标签 c++ c visual-c++ iostream exponential

我正在生成一个文本文件用作 FORTRAN 输入文件。 FORTRAN 程序指定它读取的值必须采用这样的格式

1.0

必须打印为

0.1000000E+01

截至目前,我最接近使用 iostream 的是

1.000000E+00

代码

cout << setprecision(6) << fixed << scientific << uppercase;
_set_output_format(_TWO_DIGIT_EXPONENT);
cout << 1.0 << endl;

有谁知道如上所示获取前导零的最佳方法,最好使用 ostream 而不是 printf?

最佳答案

正如我所说,你的要求是不标准的,但你可以通过一个技巧来实现:

#include <iostream>
#include <iomanip>
#include <cmath>

class Double {
public:
    Double(double x): value(x) {}
    const double value;
};

std::ostream & operator<< (std::ostream & stream, const Double & x) {
    // So that the log does not scream
    if (x.value == 0.) {
        stream << 0.0;
        return stream;
    }

    int exponent = floor(log10(std::abs(x.value)));
    double base = x.value / pow(10, exponent);

    // Transform here
    base /= 10;
    exponent += 1;

    stream << base << 'E' << exponent; // Change the format as needed

    return stream;
}

int main() {
    // Use it like this
    std::cout << std::setprecision(6) << std::fixed;
    std::cout << Double(-2.203e-15) << std::endl;
    return 0;
}

Double需要包装器,因为您无法重新定义 <<对于 double .

我没有测试那种分离方式exponentbase反对 float ,也许你可以想出一个更好的选择,但你明白了:)

关于c++ - 使用 C++ 打印带有一个前导零的指数符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21165989/

相关文章:

c++ - 计算在许多类的堆栈和堆中创建的对象

c - 为 Core 2 或 Core i7 架构完全优化的 memcpy/memmove?

c++ - 64位MFC版本访问冲突异常

c++ - kd-tree 中的无限递归

c++: string::find 对于空输入字符串的行为是否定义明确

c - 将 bsearch 与字符串数组一起使用时出现问题

c - 如何在C中使用快捷方式读取没有美元符号的价格金额?

python - 错误 : "MSVCP90.dll: No such file or directory" even though Microsoft Visual C++ 2008 Redistributable Package is installed

c++ - 在 Visual Studio C++ 的图片框中缩放图片

c++ - 如何替换字符串中特定索引处的一个字符