将浮点数转换为具有设置精度和小数位数的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(); }