【问题标题】:The precision of std::to_string(double)std::to_string(double) 的精度
【发布时间】:2013-01-25 10:53:11
【问题描述】:

使用std::to_string()将双精度转换为字符串时,有什么方法可以设置结果的精度?

【问题讨论】:

标签: c++ c++11


【解决方案1】:

没有。

返回:每个函数都返回一个字符串对象,其中包含值的字符表示 它的参数将通过使用格式说明符调用sprintf(buf, fmt, val) 生成 "%d"、"%u"、"%ld"、"%lu"、"%lld"、"%llu"、"%f"、"%f" 或 "%Lf",其中 buf 指定 足够大的内部字符缓冲区。

【讨论】:

    【解决方案2】:

    我只是在寻找解决方案,因为我正在重载 std::cout << 运算符,因此执行 std::stringstream 解决方法会很棘手。我解决了我的问题,使用std::substr() 函数来定位小数点并取一个选定的位数过去。

    std::string trimmedString = std::to_string(doubleVal).substr(0, std::to_string(doubleVal).find(".") + precisionVal + 1);
    

    这将在您的号码后为您提供“precisionVal”0。

    例如:

    double doubleVal = 3;
    int preisionVal = 2
    

    3.000000 变为 3.00

    【讨论】:

    • 请注意,这是截断而不是四舍五入
    【解决方案3】:

    我相信使用std::stringstream 和setprecision 将是最灵活/便携的选择,但如果您知道您的数据,作为一种解决方法,您可以尝试对to_string 结果进行子串化。例如:

    std::string seriesSum(int n)
    {
        double sum = 0, div = 1;
        for(int i = 0; i < n; i++) {
          sum += 1.0 / div;
          div += 3;
        }
    
        return std::to_string(round(sum * 100)/100).substr(0,4);
    }
    

    在上面的代码中,我通过获取字符串的前 4 位数字打印了两位小数 0.00,但它只有效,因为我知道整数部分永远不会超过一位数。您还可以使用string.find() 搜索小数点分隔符并使用它的位置来计算子字符串的大小,使其更具动态性。

    【讨论】:

    • 不要忘记将std::fixed 与std::setprecision(...) 一起包含,以避免得到科学计数法的结果
    猜你喜欢
    • 2017-09-25
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 2021-12-04
    • 2013-10-07
    相关资源
    最近更新 更多