C ++浮点/双精度以精确的字符串表示形式

时间:2018-12-14 09:30:50

标签: c++

我在获取浮点/双精度/长双精度值的正确/准确的字符串表示形式时遇到问题。

我有此函数尝试获取浮点值的字符串表示形式:

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)

谢谢。

1 个答案:

答案 0 :(得分:3)

数字77777777777777.7777777不能用浮点数精确表示:floatdoublelong double。相反,将选择最接近的可表示浮点数。由于浮点类型具有不同的精度,因此浮点数的最接近数比长双精度数要远。