将浮点数转换为具有设置精度和小数位数的string?
如何在C ++中将float转换为string,同时指定精度和小数位数?
例如: 3.14159265359 -> "3.14"
#include <iomanip> // setprecision #include <sstream> // stringstream double pi = 3.14159265359; stringstream stream; stream << fixed << setprecision(2) << pi; string s = stream.str();
看到固定的
使用固定的浮点标记
将strstream的
floatfield
格式标志设置为fixed
。当
floatfield
设置为fixed
,使用定点表示法写入浮点值:该值用精度字段 (precision
)指定的小数部分中的精确位数表示,并且没有指数部分。
和setprecision 。
做这种事情的习惯方法是“打印到string”。 在C ++中,这意味着使用std::stringstream
类似于:
std::stringstream ss; ss << std::fixed << std::setprecision(2) << number; std::string mystring = ss.str();
另一个选项是snprintf
:
double pi = 3.1415926; std::string s(16, '\0'); auto written = std::snprintf(&s[0], s.size(), "%.2f", pi); s.resize(written);
演示 。 应该添加error handling,即检查written < 0
。
在这里,我提供了一个负面的例子,你想避免当浮动数字转换为string。
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
注意:numvariables可以是任何接近99.463的值,你会得到相同的打印输出。 关键是避免使用方便的c ++ 11“to_string”函数。 我花了一段时间才弄出这个陷阱。 最好的方法是stringstream和sprintf方法(C语言)。 C ++ 11或更新的版本应该提供第二个参数作为浮点数后显示的位数。 现在默认是6.我正在这样做,以便其他人不会在这个问题上浪费时间。
我写了我的第一个版本,请让我知道如果你发现任何需要修复的错误。 你可以用iomanipulator来控制确切的行为。 我的function是显示小数点后的位数。
string ftos(float f, int nd) { ostringstream ostr; int tens = stoi("1" + string(nd, '0')); ostr << round(f*tens)/tens; return ostr.str(); }