繁体   English   中英

双精度到字符串的转换,具有固定的精度,并且没有尾随零

[英]double to string conversion with fixed precision and no trailing zeros

我必须通过在点后使用指定的位数将double值转换为string 但是,我必须避免打印尾随零,因此,如果doubleValue95 ,我希望看到的是"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,因此它很方便。

考虑到尝试使用十进制格式表示二进制浮点类型的所有问题,如果您是我,我将采用以下方案:

  1. 使用您喜欢的格式出示你的字符串表示double ,四舍五入到DBL_DIG - 1显著数字(让格式化做到这一点,而不是四舍五入的double数字)。

  2. 自己在小数点分隔符后修剪多余的0

您可能会发现这难以置信,但是您的要求相当特殊。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM