[英]double to string conversion with fixed precision and no trailing zeros
我必须通过在点后使用指定的位数将double
值转换为string
。 但是,我必须避免打印尾随零,因此,如果doubleValue
为95
,我希望看到的是"95"
而不是"95.000000..."
,同样,如果值是95.5
,我希望看到的是"95.5"
而不是"95.500000..."
。
这是我当前的代码,使用boost::format
:
double doubleValue = ...;
std::string fmt = (boost::format("%%.%df") % opts.floatPrecision).str();
return (boost::format(fmt) % doubleValue).str();
但是,它不能处理我提到的两种特殊情况(不打印尾随零,在int情况下不打印点)。
我想我可以从字符串中删除所有结尾的零,最后删除结尾的点(如果有)。
但是我问是否有更聪明的方法可以做到这一点。
这是我所做的:
std::string fmt = (boost::format("%%.%df") % opts.floatPrecision).str();
std::string s = (boost::format(fmt) % doubleValue).str();
int len = s.length();
while(s[len - 1] == '0') len--;
if(s[len - 1] == '.') len--;
return s.substr(0, len);
注意:使用boost不是强制性的,但是由于我已经在项目中使用了boost,因此它很方便。
考虑到尝试使用十进制格式表示二进制浮点类型的所有问题,如果您是我,我将采用以下方案:
使用您喜欢的格式出示你的字符串表示double
,四舍五入到DBL_DIG - 1
显著数字(让格式化做到这一点,而不是四舍五入的double
数字)。
自己在小数点分隔符后修剪多余的0
。
您可能会发现这难以置信,但是您的要求相当特殊。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.