std::to_string(double) 的精度

Posted

技术标签:

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

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

【问题讨论】:

另见***.com/a/16606128/2436175 【参考方案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::stringstreamsetprecision 将是最灵活/便携的选择,但如果您知道您的数据,作为一种解决方法,您可以尝试对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::fixedstd::setprecision(...) 一起包含,以避免得到科学计数法的结果

以上是关于std::to_string(double) 的精度的主要内容,如果未能解决你的问题,请参考以下文章

std::to_string - 多个重载函数的实例与参数列表匹配

有没有一种简单的方法可以将前导零添加到通过 std::to_string(int) 创建的字符串中?

编译器不知道std :: to_string? (C ++,即使在补丁之后)[重复]

int/long long/double 转换成 string的方法

多个重载函数 to_string 实例与参数列表匹配

为啥数字类型只有一个`to_string()`?