首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >双到std::具有动态精度的字符串(没有尾随零)

双到std::具有动态精度的字符串(没有尾随零)
EN

Stack Overflow用户
提问于 2016-03-01 13:37:04
回答 1查看 1.7K关注 0票数 0

我希望将double值转换为std::string。目前我在写

代码语言:javascript
复制
return std::to_string(double_value);

但这只返回7位数字,因为内部to_string()只使用带有%f格式说明符的std::vsnprintf (参见这里)。

我现在可以手动调用std::vsnprintf%.15f作为格式说明符,但这会导致尾随零。

我(在我看来非常明显)现在的目标是有这样一种方法:

代码语言:javascript
复制
string o1 = to_string(3.14)
string o2 = to_string(3.1415926536)
assert(o1 == "3.14")
assert(o2 == "3.1415926536")

这里是关于从%.20输出中裁剪尾随零的一个很好的说明,但是这个答案已经有8年了。

也许事情变了?今天,我可以在没有尾随零的情况下转换双精度的double吗?

解决方案:

根据2人的答案,您可以编写如下所示的泛型函数:

代码语言:javascript
复制
template<typename T>
inline std::string tostr(T value) {
    std::ostringstream s;
    s.precision(std::numeric_limits<T>::digits10);
    s << value;
    return s.str();
}

对于数值类型而言,它的行为与所需的相似。请注意,我使用digits10而不是max_digits10来支持良好的十进制表示,而不是更多的数字和尾随..0000001

另外,值得补充的是,[v][s][n]printf()连同格式字符串"%.15g“(而不是'f')也将减少尾随零(因为它们不能用64位来表示,从而导致尾随'1',例如3.12 -> "3.1200000000000001")。

还是奇怪的

也许有人可以告诉我,为什么std::to_string(double)是用C++-11硬代码引入到vsnprintf(..., "%f", ...)中的,而不是像vsnprintf("%.15g")那样的,它可以在不影响C代码的情况下得到更精确的表示?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-01 14:00:06

您可以在流操作器中使用字符串流(sstring),请参见下面的示例:

代码语言:javascript
复制
  std::stringstream ss1;
  std::stringstream ss2;
  ss1.precision(15);    
  ss1 << 3.14;
  std::cout << ss1.str()<<' '<<("3.14" == ss1.str())<<std::endl;
  ss2.precision(15);
  ss2 << 3.1415926536;
  std::cout << ss2.str()<<' '<<("3.1415926536" == ss2.str())<<std::endl;

也可以使用boost格式。这是一个链接

代码语言:javascript
复制
  std::cout<<format("%.2f") % 3.14 <<std::endl;
  std::cout<<format("%.10f") % 3.1415926536 <<std::endl;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35724411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档