首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用ostringstream格式化double到string

使用ostringstream格式化double到string
EN

Stack Overflow用户
提问于 2018-12-07 00:32:54
回答 2查看 0关注 0票数 0

我想将double转换为字符串,在点之后舍入到2位小数。我希望1.009表示为“1.01”,1.0表示为“1”。这就是我尝试过的:

代码语言:javascript
复制
std::ostringstream oss;
oss << std::fixed << std::setprecision(2) << std::noshowpoint  << 1.0;

它输出“1.00”,即使我从未设置宽度甚至指定std::noshowpoint。如何实现所需的表示?

EN

回答 2

Stack Overflow用户

发布于 2018-12-07 09:16:14

最佳方案:

代码语言:javascript
复制
inline double twodec(double n) { return floor(n * 100 + 0.5) / 100; }

oss << twodec(1.0) << ' ' << twodec(1.009);

当浮点数设置为固定时,浮点值使用定点表示法写入,这意味着该值在精度字段指定的馏分部分中与指数部分指定的数字完全相同

所以,“修复”是行不通的。

也就是说,我能想到做你想做的事的唯一方法是:

  • 首先将数字四舍五入到所需的精度(即floor(n * 100 + 0.5) / 100),然后使用默认表示(即不指定固定或科学或精确 - 如果fixedscientific有效,首先清除std::cout.unsetf(std::ios::floatfield))。
  • 根据您想要在点之前和之后看到的最大数字总数来动态设置精度(这是精度指定的值); 要做到这一点,你可以计算出小数点前的部分有多少位数(也许使用log base 10)并加2
  • 将结果传输到a ostringstream,然后删除尾随0和任何'。'
票数 0
EN

Stack Overflow用户

发布于 2018-12-07 10:15:50

解决方案:

代码语言:javascript
复制
template <typename T>
std::string stringForNumber( T f, int precision /* = 0 */, bool fixedWidth /*= false*/ )
{
    std::ostringstream ss;
    ss.setf(std::ios_base::fixed);
    if (precision > 0)
        ss << std::setprecision(precision);

    ss << f;
    std::string str(ss.str());
    if (!fixedWidth) // Removing trailing 0
    {
        const auto pointLocation = str.find_first_of(".,");
        if (pointLocation != std::string::npos)
        {
            const auto lastZeroPos = str.find_last_of('0');
            const auto lastNotZeroPos = str.find_last_not_of('0');
            if (lastNotZeroPos == pointLocation) // Integer number
                str.erase(pointLocation);
            else if (lastZeroPos != std::string::npos && lastNotZeroPos != std::string::npos && pointLocation < lastZeroPos && lastNotZeroPos < lastZeroPos)
            {
                str.erase(lastNotZeroPos+1);
            }
        }
    }

    return str;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100003017

复制
相关文章

相似问题

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