如何在指定精度和十进制数字的同时将浮点数转换为C ++中的字符串?
例如: 3.14159265359 -> "3.14"
如何在指定精度和十进制数字的同时将浮点数转换为C ++中的字符串?
例如: 3.14159265359 -> "3.14"
Answers:
一种典型的方法是使用stringstream
:
#include <iomanip>
#include <sstream>
double pi = 3.14159265359;
std::stringstream stream;
stream << std::fixed << std::setprecision(2) << pi;
std::string s = stream.str();
见固定
使用固定的浮点表示法
floatfield
将str流的格式标志设置为fixed
。当
floatfield
设置为时fixed
,浮点值使用定点表示法写入:该值用精确度字段(precision
)指定的十进制位数精确地表示,而没有指数部分。
为了进行技术转换,例如将数据存储在XML或JSON文件中,C ++ 17定义了to_chars系列函数。
假设有一个兼容的编译器(在撰写本文时我们缺少此编译器),可以考虑这样的事情:
#include <array>
#include <charconv>
double pi = 3.14159265359;
std::array<char, 128> buffer;
auto [ptr, ec] = std::to_chars(buffer.data(), buffer.data() + buffer.size(), pi,
std::chars_format::fixed, 2);
if (ec == std::errc{}) {
std::string s(buffer.data(), ptr);
// ....
}
else {
// error handling
}
snprintf
在这种情况下会更好?请解释一下...它肯定不会更快,产生更少的代码[我编写了printf实现,它在2000行以下的代码中相当紧凑,但是宏扩展到2500行左右]
__printf_fp
功能-奇怪的是,它花了这么长的时间stringstream
,因为它实际上不是必须的。
这里仅使用std的解决方案。但是,请注意,这仅舍入。
float number = 3.14159;
std::string num_text = std::to_string(number);
std::string rounded = num_text.substr(0, num_text.find(".")+3);
对于rounded
它产生:
3.14
该代码将整个浮点数转换为字符串,但是将所有字符都切成“。”后2个字符。
number + 0.005
以我为例。
在这里,我提供一个否定的示例,您在将浮点数转换为字符串时要避免。
float num=99.463;
float tmp1=round(num*1000);
float tmp2=tmp1/1000;
cout << tmp1 << " " << tmp2 << " " << to_string(tmp2) << endl;
你得到
99463 99.463 99.462997
注意:num变量可以是接近99.463的任何值,您将获得相同的打印输出。关键是要避免方便的c ++ 11“ to_string”函数。我花了一段时间才摆脱这个陷阱。最好的方法是stringstream和sprintf方法(C语言)。C ++ 11或更高版本应提供第二个参数,即要显示的浮点之后的位数。现在的默认值为6。我认为这是为了使其他人不会浪费时间在此主题上。
我写了第一个版本,如果您发现任何需要修复的错误,请告诉我。您可以使用iomanipulator控制确切的行为。我的功能是显示小数点后的位数。
string ftos(float f, int nd) {
ostringstream ostr;
int tens = stoi("1" + string(nd, '0'));
ostr << round(f*tens)/tens;
return ostr.str();
}