我使用C++
制作了SDL
计划。在渲染过程中,我需要绘制一些图形组件。我有时需要将double
变量(舍入到一位小数)转换为std::string
。
为此,我目前正在使用ostringstream
对象,它可以正常工作。
std::ostringstream ss;
ss << std::fixed << std::setprecision(1) << x;
但是,我想知道这种转换变量的方式在性能方面是否是一个好主意。
我尝试用double
对std::to_string(std::round(x * 10) / 10))
个变量进行舍入,但它不起作用 - 我的输出仍然是2.500000000
。
ostringstream
会产生沉重的代价吗? 答案 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