我在获取浮点/双精度/长双精度值的正确/准确的字符串表示形式时遇到问题。
我有此函数尝试获取浮点值的字符串表示形式:
template <typename T>
std::string double_to_string(const T& v) {
static_assert(std::is_floating_point<T>::value,
"T is not a floating point type");
std::stringstream sstr;
sstr.setf(std::ios::fixed | std::ios::showpoint);
sstr << v << std::ends;
return sstr.str();
}
我用float,double和long double值调用它,但没有获得我传递给函数的实际值的正确/准确的字符串表示形式
// float:
std::cout << double_to_string(77777777777777.7777777f) << std::endl;
// double:
std::cout << double_to_string(77777777777777.7777777) << std::endl;
// long double:
std::cout << double_to_string(77777777777777.7777777L) << std::endl;
我得到的输出如下:
// float:
77777780867072.000000
// double:
77777777777777.781250
// long double:
77777777777777.777779
有什么办法可以在C ++中获得float / double / long double值的准确字符串表示形式?
(ps。我正在使用g ++ 7.2.0)
谢谢。
答案 0 :(得分:3)
数字77777777777777.7777777
不能用浮点数精确表示:float
,double
或long double
。相反,将选择最接近的可表示浮点数。由于浮点类型具有不同的精度,因此浮点数的最接近数比长双精度数要远。