gpt4 book ai didi

c++ - 将 double 插入到 stringstream 时避免舍入

转载 作者:行者123 更新时间:2023-11-28 02:04:49 25 4
gpt4 key购买 nike

我正在使用此函数将 double f 转换为小数点后有 p 位的字符串。

static std::string doubleToString(double f, int p)
{
std::stringstream ss;
ss << std::fixed << std::setprecision(p) << f;
std::string s = ss.str();
s.erase(s.find_last_not_of('0') + 1, std::string::npos);
return (s[s.size()-1] == '.') ? s.substr(0, s.size()-1) : s;
}

末尾剩余的 0 被删除。例如 1.23000 得到 1.23

输入:

double test1 = 1;
double test2 = 1.12345678;
double test3 = 1.123456789010;

std::cout << doubleToString(test1, 8) << " " << doubleToString(test2, 8) << " " << doubleToString(test3, 8);

输出:

1 1.12345678 1.12345679

如您所见,test1test2 打印正常。 test3 但是在第 8 位数字后四舍五入。我想避免这种情况并“删除”其余数字,以便:doubleToString(1.123456789010, 8) 返回 1.12345678

最有效的方法是什么?

最佳答案

对您的功能进行小的修改即可完成工作;只需将一些额外的数字放入流中,并在转换后将其删除。您需要允许一些 舍入,因为二进制值可能略小于您期望的十进制值。在我下面的代码中,我将字符串转换限制为 14 位数字,这大约是您可以从 1.0 到 10.0 之间的 IEEE double 期望的最大值;如果您期望值大于此值,则需要调整算法,因为小数点后的准确位数会减少。

std::string doubleToString(double f, int p)
{
std::stringstream ss;
int p2 = min(p + 2, 14);
ss << std::fixed << std::setprecision(p2) << f;
std::string s = ss.str();
size_t point = s.find('.');
if (point != std::string::npos && point + 1 + p < s.size())
s.erase(point + 1 + p);
s.erase(s.find_last_not_of('0') + 1, std::string::npos);
return (s[s.size()-1] == '.') ? s.substr(0, s.size()-1) : s;
}

http://ideone.com/xGoDiH 查看它的运行情况.

关于c++ - 将 double 插入到 stringstream 时避免舍入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37945290/

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