C++ Builder 忽略大数的 std::fixed

C++ Builder ignores std::fixed for big numbers

考虑以下程序,该程序旨在将浮点数打印到小数点后三位:

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

int main() {
    double val = 1.234567890e50;

    std::stringstream ss;
    ss << std::fixed << std::setprecision(3);
    ss << val;

    std::cout << ss.str() << std::endl;    
    return 0;
}

这个数字不能精确地表示为双精度,但现在这已经无关紧要了。

在 GCC 5.1 上,程序打印

123456789000000004671007453916432257001527036608512.000

在 Embarcadero C++ Builder 10.1(编译器 bcc32c 版本 3.3.1)上,输出为:

1.234567890000000047000000000000000000000e+50

为什么 C++ Builder 输出与选定的浮点符号 std::fixed 不匹配?即使数字是 10^300,GCC 也会使用选定的符号显示它。

为什么这两个编译器的工作方式不同? C++ 标准是否定义了字符串转换在这种情况下的工作方式?

Embarcadero C++ Builder 10.1 有一个错误。

std::setprecision(3);设置小数点分隔符显示的位数为正好3,不管有无该平台上的浮点方案可以表示该数字。

GCC5.1 与此兼容。

Embarcadero C++ Builder 10.1 不是。

参见 http://en.cppreference.com/w/cpp/io/manip/setprecision,它几乎代表了 C++ 标准。