double val = 0.1;
std::stringstream ss;
ss << val;
std::string strVal= ss.str();
在 Visual Studio 的调试器中,val
的值为 0.10000000000000001(因为 0.1 无法精确表示)。当使用 stringstream 进行转换时,strVal
等于 "0.1"
。然而,使用 boost::lexical_cast 时,得到的 strVal
是 "0.10000000000000001"
。另外一个例子如下:
double val = 12.12305000012;
在 Visual Studio 中,val
显示为 12.123050000119999,并且使用 stringstream 和默认精度(6)时,它变成了 12.1231。我不太理解为什么它不是 12.12305(...)。是否有默认精度,或者 stringstream 是否具有将不能精确表示的 double 值转换的特定算法?
谢谢。
ss.setf(ios::fixed);
来使其正常工作。如果我不这样做,那么精度就不会改变。 - Sam Goldbergstd::setprecision(std::numeric_limits<double>::digits10)
可以获得完整的双精度浮点数精度。 - kugadigits10
在 Visual Studio 2015 上无法正常工作。请尝试使用18014398509481980.0
和18014398509481982.0
进行测试,至少需要 17 位才能获得完整的精度。请参考 https://dev59.com/WG025IYBdhLWcg3wQDlb 并在 https://onlinegdb.com/Sk6yXmeY7 进行尝试。 - Kevin Smythstd::setprecision(std::numeric_limits<long double>::digits10 + 1)
。 - Max Levystd::numeric_limits<T>::max_digits10
。有关std::numeric_limits<T>::max_digits10
和std::numeric_limits<T>::digits10
之间的区别,请参见 https://dev59.com/z2Eh5IYBdhLWcg3wZyvG#22458961。 - Catree