将float转换为字符串,精确度和指定的小数位数?

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)

固定

使用固定浮点表示法

stringstreamstr流的格式标志设置为floatfield.

fixed设置floatfield为时,使用定点表示法写入浮点值:该值用精确字段(fixed)指定的小数部分中的数字精确表示,并且没有指数部分.

setprecision.


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 个字符。

  • 唯一的问题是,这样你实际上并没有对数字进行四舍五入。 (3认同)

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.


vit*_*aut 6

您可以使用该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{}用作而不是%


Kem*_*hou 5

在这里,我提供了一个反面示例,您在将浮点数转换为字符串时希望避免这种情况。

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)