标准库to_string(double)在vs2015中给出了错误的值。有什么解决办法吗?

suk*_*mar 1 c++ string stl c++11 visual-studio-2015

在Vs2013中to_string函数std :: to_string(1.0e + 30)提供输出1000000000000000000000000000000000000.000000

在Vs2015中to_string函数std :: to_string(1.0e + 30)提供输出1000000000000000019884624838656.000000

如果是标准库问题,是否有可用的修复程序或补丁?

我搜索了此问题,并遇到了一篇介绍https://groups.google.com/a/isocpp.org/forum/#!topic/std-discussion/6xhWgsEuvPo的文章,其中 to_string在float或double转换中存在错误。

double d = 1.0000000000000000e+30;
std::string s = std::to_string(d);
if (s.length())
{
    s;
}
Run Code Online (Sandbox Code Playgroud)

这是1000000000000000019884624838656.000000

预期结果是1000000000000000000000000000000000000.000000在vs2013中给出但在vs2015中没有给出

Cal*_*eth 5

按照标准,两者都是“正确的”结果。

有三个浮点类型:floatdouble,和long double。该类型double至少提供与相同的精度float,而该类型long double至少提供与一样的精度double。该类型的值float集是该类型的值集的子集double;该类型的值double集是该类型的值集的子集long double。浮点类型的值表示形式是实现定义的。[注:本文档对浮点运算的准确性没有任何要求;另见[support.limits]。-?尾注?]

VS 2015的结果更为常见,因为它符合IEEE 754的要求。根据该定义, 1000000000000000000000000000000不可代表,最接近的可代表数字为1000000000000000019884624838656

53位有效位数精度为15到17个有效十进制数字精度。

实际上,我对VS 2013的发布感到惊讶1000000000000000000000000000000。请参阅cppreference上的示例