一个简单的方法是这样的:
std::string float2string(double f)
{
std::stringstream ss;
ss << std::fixed << std::setprecision(122) << f; // 122 is LARGE, but you may find that really tiny or really large numbers still don't work out...
std::string s = ss.str();
std::string::size_type len = s.length();
int zeros = 0;
while(len > 1 && s[--len] == '0')
zeros++;
if (s[len] == '.') // remove final '.' if number ends with '.'
zeros++;
s.resize(s.length()-zeros);
return s;
}
我已经对其进行了一些测试。最大的问题是它为某些数字提供了大量的小数,像 0.05 这样的东西出来,0.05000000000000000277555756156289135105907917022705078125
而 0.7 变成:
0.05000000000000000277555756156289135105907917022705078125
那是因为它不是二进制形式的“精确”数字。
我认为解决方案是通过取整数位数(或 floor(log(f)/log(10)+1))然后从常数中减去该数字来粗略计算您想要的结果位数,例如 17,这是您可以从 double 中获得的位数。然后删除多余的零。
我暂时先把它留下,因为我还有一些其他的事情要做,我应该在不久前就开始做……;)