我想转换浮点值,即在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
我建议你用格式说明符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.14159267
是double
。 float
常数需要f
后缀,例如3.14159267f
。
如果您只想打印出来:
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;
从理论上讲,这应该适用于符合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);
不幸的是,它没有,甚至没有gcc
或clang
的主干版本。似乎P0067R5实现起来并不那么明显,另见cppreference compiler support(搜索“P0067R5”)或this reddit thread。