如何在指定精度和放大器的同时将浮点数转换为C ++中的字符串?小数位数?
例如:3.14159265359 -> "3.14"
答案 0 :(得分:91)
#include <iomanip> // setprecision
#include <sstream> // stringstream
double pi = 3.14159265359;
stringstream stream;
stream << fixed << setprecision(2) << pi;
string s = stream.str();
请参阅fixed
使用固定浮点表示法
将 str 流的
floatfield
格式标记设置为fixed
。当
floatfield
设置为fixed
时,使用定点表示法写入浮点值:该值用指定的小数部分中的数字表示。精度字段(precision
)且没有指数部分。
答案 1 :(得分:24)
执行此类操作的习惯方法是“打印到字符串”。在C ++中,这意味着使用std::stringstream
之类的东西:
std::stringstream ss;
ss << std::fixed << std::setprecision(2) << number;
std::string mystring = ss.str();
答案 2 :(得分:9)
另一个选项是snprintf
:
double pi = 3.1415926;
std::string s(16, '\0');
auto written = std::snprintf(&s[0], s.size(), "%.2f", pi);
s.resize(written);
Demo。应添加错误处理,即检查written < 0
。
答案 3 :(得分:3)
这里仅使用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个字符。
答案 4 :(得分:2)
您可以使用{fmt} library中的fmt::format
函数:
#include <fmt/core.h>
int main()
std::string s = fmt::format("{:.2f}", 3.14159265359); // s == "3.14"
}
其中2
是精度。
已建议使用以下格式化工具来实现C ++中的标准化:P0645。 P0645和{fmt}都使用类似Python的格式字符串语法,类似于printf
,但使用{}
作为定界符,而不是%
。
答案 5 :(得分:1)
这里我提供了一个负面示例,您希望在将浮点数转换为字符串时避免使用。
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&#34; to_string&#34;功能。我花了一段时间才摆脱这个陷阱。最好的方法是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();
}