【发布时间】:2016-06-21 13:05:06
【问题描述】:
我正在使用此函数将双精度 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
如您所见,test1 和 test2 打印良好。 test3 但是在第 8 位之后被四舍五入。我想避免这种情况并“削减”其余数字,以便:doubleToString(1.123456789010, 8) 返回1.12345678。
最有效的方法是什么?
【问题讨论】:
-
你为什么不找
.,把<position of . > + 8之后的所有东西都删掉? -
您依赖第 8 位的精确值但仍想使用浮点类型是有原因的?
-
@GMichael 我认为舍入发生在这一行:
ss << std::fixed << std::setprecision(p) << f;。在此之前,我没有可以在其中查找“。”的字符串。之后,字符串的长度已经为p。 @Warren P 是的,这是有原因的。它必须是精确的和浮点的。
标签: c++ floating-point double rounding