gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:34:09 25 4
gpt4 key购买 nike

我有一个使用 SDLC++ 程序。在渲染过程中,我需要绘制一些图形组件。有时我需要将 double 变量(四舍五入到一位小数)转换为 std::string

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

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

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

我试图用 std::to_string(std::round(x * 10)/10)) 舍入 double 变量,但它没有不工作——我仍然得到类似 2.500000000 的输出。

  • 还有其他解决方案吗?
  • ostringstream 是否会产生高昂的成本?

最佳答案

您不能使用 std::to_string 指定精度,因为它直接等同于带有参数 %fprintf (如果使用 double)。

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

#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;
}

它输出(see on Coliru):

2.50000

2.5

2.500

虽然我没有检查性能......但我认为你甚至可以通过将它封装到一个类中来做得更好(比如只调用 std::fixedstd::精度一次)。

否则,您仍然可以使用带有适合您的参数的 sprintf


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

#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;
}

另一种不使用 ostringstream 的解决方案(View on Coliru):

#include <iostream>
#include <string>
#include <memory>

std::string my_to_string(const double & value) {
const int length = std::snprintf(nullptr, 0, "%.1f", value);

std::unique_ptr<char[]> buf(new char[length + 1]);
std::snprintf(buf.get(), length + 1, "%.1f", value);

return std::string(buf.get());
}

int main(int argc, char * argv[])
{

std::cout << my_to_string(argc) << std::endl;
std::cout << my_to_string(2.5156) << std::endl;

}

关于c++ - 观察给定的精度,快速将 double 转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34744591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com