gpt4 book ai didi

c++ - 如何使用前导零和四舍五入小数格式化 double

转载 作者:行者123 更新时间:2023-12-01 14:48:51 26 4
gpt4 key购买 nike

是否有一种优雅的方式将 double 格式化为小数点前具有固定数量数字的字符串(用前导零填充),但只显示需要的小数且具有最大精度?

例如,前面固定 3 位数字,小数点后面最多 2 位数字:

// desired:
1.00000 -> "001"
1.10000 -> "001.1"
1.12345 -> "001.12"

// not:
1.10000 -> "0001.1" // too many leading zeroes
1.12345 -> "1.1235" // too few leading zeroes, too many digits after the decimal point

附加约束:
  • 小数需要实际四舍五入,而不是用空格填充
  • 负数不是问题,在此之前它们会被过滤掉
  • 输入范围为 [0.0, 180.0]

  • 我们研究了 printf、stringstream、boost::format 和 fmtlib ,但它们似乎都没有对小数点前的位数提供特定的控制。控制这一点的标准方法是调整字段宽度和精度,但这似乎不能提供我们需要的粒度。

    到目前为止,我们发现的最“优雅”的解决方案如下(其中 123.1f 是输入值):
    boost::trim_right_copy_if(fmt::format("{:06.2f}", 123.1f), boost::is_any_of("0"))

    但我不禁认为必须有一个更优雅/更强大的解决方案。

    对于上下文,我们有一个显示纬度/经度坐标的 GUI。我们的客户要求我们用前导零填充,但尽可能减少数字。这是在减少不必要的信息和尽可能避免混淆之间的折衷。例如。:
    W135°2'2.3344" -> W135°02'02.33"
    W135°22.3344" -> W135°00'22.33"
    W135°2'3" -> W135°02'03"
    W135°22'2.999" -> W135°22'03"
    W1°35" -> W001°00'35"
    W1°35' -> W001°35'00"

    最佳答案

    这个怎么样:

    #include <iostream>
    #include <iomanip>
    #include <string>
    #include <sstream>

    void
    output(double d)
    {
    std::stringstream pre;
    pre << static_cast<long int>(d);

    std::stringstream post;
    post << d-static_cast<long int>(d);

    int pre_digits = pre.str().length();
    int post_digits = post.str().length() - pre_digits;
    int width = pre_digits + post_digits + 2;

    if (post_digits > 2) {
    post_digits = 2;
    width = pre_digits + post_digits + 3;
    }

    std::cout << std::setfill('0')
    << std::setprecision(pre_digits + post_digits)
    << std::setw(width)
    << d
    << '\n';
    }

    int main()
    {
    output(1.00000);
    output(1.10000);
    output(1.12345);

    return 0;
    }

    结果是:
    001
    001.1
    001.12

    更新 :进行了一些编辑以确保输出与您要查找的相同。

    关于c++ - 如何使用前导零和四舍五入小数格式化 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59861406/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com