Sha*_*ews 73 c++ string floating-point
如何在指定精度和小数位数的同时将浮点数转换为C++中的字符串?
例如: 3.14159265359 -> "3.14"
Ale*_*exD 104
#include <iomanip>
#include <sstream>
double pi = 3.14159265359;
std::stringstream stream;
stream << std::fixed << std::setprecision(2) << pi;
std::string s = stream.str();
Run Code Online (Sandbox Code Playgroud)
见固定
使用固定浮点表示法
stringstream将str流的格式标志设置为floatfield.当
fixed设置floatfield为时,使用定点表示法写入浮点值:该值用精确字段(fixed)指定的小数部分中的数字精确表示,并且没有指数部分.
Mat*_*son 25
做这种事情的习惯方法是"打印到字符串".在C++中意味着使用std::stringstream类似的东西:
std::stringstream ss;
ss << std::fixed << std::setprecision(2) << number;
std::string mystring = ss.str();
Run Code Online (Sandbox Code Playgroud)
小智 12
这是仅使用 std 的解决方案。但是,请注意,这只会向下取整。
float number = 3.14159;
std::string num_text = std::to_string(number);
std::string rounded = num_text.substr(0, num_text.find(".")+3);
Run Code Online (Sandbox Code Playgroud)
因为rounded它产生:
3.14
Run Code Online (Sandbox Code Playgroud)
该代码将整个浮点数转换为字符串,但将“.”后的所有字符剪切为 2 个字符。
Col*_*mbo 10
另一种选择是snprintf:
double pi = 3.1415926;
std::string s(16, '\0');
auto written = std::snprintf(&s[0], s.size(), "%.2f", pi);
s.resize(written);
Run Code Online (Sandbox Code Playgroud)
演示.应添加错误处理,即检查written < 0.
您可以使用该fmt::format功能从{} FMT库:
#include <fmt/core.h>
int main()
std::string s = fmt::format("{:.2f}", 3.14159265359); // s == "3.14"
}
Run Code Online (Sandbox Code Playgroud)
2精度在哪里。
已提出此格式化工具以在C ++:P0645中进行标准化。P0645和{fmt}都使用类似Python的格式字符串语法,该语法类似于的语法,printf但{}用作而不是%。
在这里,我提供了一个反面示例,您在将浮点数转换为字符串时希望避免这种情况。
float num=99.463;
float tmp1=round(num*1000);
float tmp2=tmp1/1000;
cout << tmp1 << " " << tmp2 << " " << to_string(tmp2) << endl;
Run Code Online (Sandbox Code Playgroud)
你得到
99463 99.463 99.462997
Run Code Online (Sandbox Code Playgroud)
注意: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();
}
Run Code Online (Sandbox Code Playgroud)