C++ vs2015中给出错误值的标准库到_字符串(双精度)。有什么解决办法吗?
在Vs2013中,to_string函数std::to_string(1.0e+30)提供输出10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 在Vs2015中,to_string函数std::to_string(1.0e+30)提供输出10000000000000019884624838656.000000 如果是标准库问题,是否有任何可用的修复程序或修补程序 我在搜索这个问题时遇到了一篇文章 to_字符串在浮点或双精度转换中有错误C++ vs2015中给出错误值的标准库到_字符串(双精度)。有什么解决办法吗?,c++,string,c++11,visual-studio-2015,stl,C++,String,C++11,Visual Studio 2015,Stl,在Vs2013中,to_string函数std::to_string(1.0e+30)提供输出10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
double d = 1.0000000000000000e+30;
std::string s = std::to_string(d);
if (s.length())
{
s;
}
这里给出的值为10000000000000019884624838656.000000
预期结果为10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
有三种浮点类型:float
、double
和longdouble
。类型double
提供的精度至少与float
相同,类型long double
提供的精度至少与double
相同。float
类型的值集是double
类型的值集的子集;double
类型的值集是long double
类型的值集的子集。浮点类型的值表示由实现定义。[ 注:本文件对浮点运算的精度无任何要求;另请参见- 尾注 ]
VS 2015结果更常见,因为这符合。根据该定义,10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
53位有效位精度提供15到17位有效十进制数字精度
实际上,我很惊讶VS 2013是如何达到10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
有三种浮点类型:float
、double
和long double
。类型double
提供的精度至少与float
相同,类型long double
提供的精度至少与double
相同。类型float
的值集为double
类型的值集的子集;double
类型的值集是long double
类型的值集的子集。浮点类型的值表示由实现定义[ 注:本文件对浮点运算的精度无任何要求;另请参见- 尾注 ]
VS 2015结果更常见,因为这符合。根据该定义,10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
53位有效位精度提供15到17位有效十进制数字精度
实际上,我对VS 2013如何达到10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
#include <boost/lexical_cast.hpp>
double d = 1.0000000000000000e+30;
std::string s = boost::lexical_cast<std::string>(d);
std:: cout << s;
您还可以使用boost库来避免此问题:
#include <boost/lexical_cast.hpp>
double d = 1.0000000000000000e+30;
std::string s = boost::lexical_cast<std::string>(d);
std:: cout << s;
你试过sprintf_s(..)吗?它会给出同样的结果吗?旁白:你期望s;
做什么?它也会给出与10000000000000019884624838656.000000相同的输出这里显示的问题是示例代码“每个程序员都应该知道浮点算术”:…虽然您的示例有点特殊,您只有“类似整数”的值,但它仍然是编码为IEEE754的浮点值,所以您只是以一种有点“不人道”的方式达到了该数字类型的极限,但从计算机的角度来看,这一切都是正确的。您尝试过sprintf_s(…)相反?它会给出相同的结果吗?旁白:您希望s;
做什么?它也会给出与10000000000000019884624838656.000000相同的输出这里显示的问题是示例代码“每个程序员都应该知道浮点算术”:..尽管您的示例有点特殊,您只有“类似整数的”值,但它仍然是编码为IEEE754的浮点值,所以您只是在有点“不人道”的情况下达到了该数字类型的极限是的,但从计算机的角度来看,这一切都是正确的。或者只是std::cout@Caleth我认为Q要求某种方法将一个大的双精度的值转换成一个字符串,而不仅仅是打印它。错误的主要原因您已经正确地提到了。但这也可以作为解决代码中该问题的一种方法。或者只是std::cout@Cale我认为Q需要某种方法将一个大的双精度的值转换成一个字符串,而不仅仅是打印它。错误的主要原因您已经正确地提到了。但这也可以作为解决代码中该问题的一种方法。