将float转换为std :: string而不会丢失精度。另外我不想使用sprintf

问题描述 投票:-1回答:3

我想转换浮点值,即在std :: string中的3.14159267我不想使用sprintf

#include <iostream>   // std::cout
#include <string>     // std::string, std::to_string

int main ()
{
  std::string pi = "pi is " + std::to_string(3.14159267);
  std::cout<<pi<<std::endl;
  return 0;
}

我的结果为3.141593

c++
3个回答
2
投票

我建议你用格式说明符snprintf调用"%.16g" - 打印一个十进制的double,精度为16位有效数字。有关详细信息,请参阅Number of Digits Required For Round-Trip Conversions。例如。:

inline std::string as_string(double value) {
    char buf[32];
    return std::string(buf, std::snprintf(buf, sizeof buf, "%.16g", value));
}

*printf函数是基本的转换例程,其他一切都使用它们。

GNU C ++标准库中的std::to_string

inline string to_string(double __val)  {
  const int __n =  __gnu_cxx::__numeric_traits<double>::__max_exponent10 + 20;
  return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, __n, "%f", __val);
}

std::ostream还将*snprintf称为数字格式。


另请注意,3.14159267doublefloat常数需要f后缀,例如3.14159267f


4
投票

如果您只想打印出来:

std::cout<< std::setprecision(9) << 3.14159267 << std::endl;

如果要设置字符串的精度:

  double pi = 3.14159265359;
  std::stringstream stream;
  stream << std::setprecision(9) << pi;
  std::string pi_string = stream.str();
  std::cout<< "Pi:" << pi_string << std::endl;

1
投票

从理论上讲,这应该适用于符合C ++ 17的编译器(并且应该是快速且与语言环境无关的):

#include <charconv>

const double pi = 3.14159267;
const int prec = 6;
char buffer[100];

auto [ptr, ec] = std::to_chars(buffer, std::end(buffer),
    pi, std::chars_format::fixed, prec);

不幸的是,它没有,甚至没有gccclang的主干版本。似乎P0067R5实现起来并不那么明显,另见cppreference compiler support(搜索“P0067R5”)或this reddit thread

© www.soinside.com 2019 - 2024. All rights reserved.