【发布时间】:2013-01-25 10:53:11
【问题描述】:
使用std::to_string()将双精度转换为字符串时,有什么方法可以设置结果的精度?
【问题讨论】:
使用std::to_string()将双精度转换为字符串时,有什么方法可以设置结果的精度?
【问题讨论】:
没有。
返回:每个函数都返回一个字符串对象,其中包含值的字符表示 它的参数将通过使用格式说明符调用
sprintf(buf, fmt, val)生成"%d"、"%u"、"%ld"、"%lu"、"%lld"、"%llu"、"%f"、"%f"或"%Lf",其中 buf 指定 足够大的内部字符缓冲区。
【讨论】:
我只是在寻找解决方案,因为我正在重载 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
【讨论】:
我相信使用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(...) 一起包含,以避免得到科学计数法的结果