将float转换为精确的&指定的小数位数?

时间:2015-03-22 22:30:08

标签: c++ string floating-point

如何在指定精度和放大器的同时将浮点数转换为C ++中的字符串?小数位数?

例如:3.14159265359 -> "3.14"

6 个答案:

答案 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)且没有指数部分。

setprecision

答案 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();
}