将double转换为字符串,快速观察给定的精度

时间:2016-01-12 13:09:16

标签: c++ sdl ostringstream

我使用C++制作了SDL计划。在渲染过程中,我需要绘制一些图形组件。我有时需要将double变量(舍入到一位小数)转换为std::string

为此,我目前正在使用ostringstream对象,它可以正常工作。

std::ostringstream ss;
ss << std::fixed << std::setprecision(1) << x;

但是,我想知道这种转换变量的方式在性能方面是否是一个好主意。

我尝试用doublestd::to_string(std::round(x * 10) / 10))个变量进行舍入,但它不起作用 - 我的输出仍然是2.500000000

  • 还有其他解决方案吗?
  • ostringstream会产生沉重的代价吗?

1 个答案:

答案 0 :(得分:3)

您无法使用std::to_string指定精度,因为它与参数printf的{​​{1}}直接等效(如果使用%f)。

如果您担心每次都不分配流,您可以执行以下操作:

double

输出(see on Coliru):

  

2.50000

     

2.5

     

2.500

虽然我没有检查性能......但我认为你甚至可以把它封装成一个类(比如只调用#include <iostream> #include <sstream> #include <iomanip> std::string convertToString(const double & x, const int & precision = 1) { static std::ostringstream ss; ss.str(""); // don't forget to empty the stream ss << std::fixed << std::setprecision(precision) << x; return ss.str(); } int main() { double x = 2.50000; std::cout << convertToString(x, 5) << std::endl; std::cout << convertToString(x, 1) << std::endl; std::cout << convertToString(x, 3) << std::endl; return 0; } std::fixed一次)。

否则,您仍然可以将std::precision与适合您的参数一起使用。

进一步,使用一个封装类,您可以将其用作静态实例或另一个类的成员......如您所愿(View on Coliru)。

sprintf

另一种不使用#include <iostream> #include <sstream> #include <iomanip> class DoubleToString { public: DoubleToString(const unsigned int & precision = 1) { _ss << std::fixed; _ss << std::setprecision(precision); } std::string operator() (const double & x) { _ss.str(""); _ss << x; return _ss.str(); } private: std::ostringstream _ss; }; int main() { double x = 2.50000; DoubleToString converter; std::cout << converter(x) << std::endl; return 0; } View on Coliru)的解决方案:

ostringstream