好吧,所以我正在尝试从具有给定位数精度(小数前后或不带小数点的总数字)的 double 值中截断实际值,而不仅仅是输出它们,而不仅仅是将它们四舍五入。我为此找到的唯一内置函数会截断所有小数,或四舍五入到给定的小数精度。 我在网上找到的其他解决方案,只能在您知道小数点前的位数或整个数字时才能执行。 该解决方案应该足够动态以处理任何数字。我编写了一些代码来完成下面的技巧,但是我无法动摇有更好的方法来做到这一点的感觉。有谁知道更优雅的东西?也许是我不知道的内置函数?
我应该提一下这样做的原因。有 3 种不同的观测值来源。所有这 3 个来源都同意某种程度的精确度。如下图,都在10位数以内。 4659.96751751236 4659.96751721355 4659.96751764253 但是我只需要从其中一个来源中提取。所以最好的方法是只使用所有 3 个来源都同意的精度。所以它不像我在操纵数字然后需要截断精度,它们是观察值。期望的结果是 4659.967517
双截断(双数字,整数数字) {
// check valid digits
if (digits < 0)
return num;
// create string stream for full precision (string conversion rounds at 10)
ostringstream numO;
// read in number to stream, at 17+ precision things get wonky
numO << setprecision(16) << num;
// convert to string, for character manipulation
string numS = numO.str();
// check if we have a decimal
int decimalIndex = numS.find('.');
// if we have a decimal, erase it for now, logging its position
if(decimalIndex != -1)
numS.erase(decimalIndex, 1);
// make sure our target precision is not higher than current precision
digits = min((int)numS.size(), digits);
// replace unwanted precision with zeroes
numS.replace(digits, numS.size() - digits, numS.size() - digits, '0');
// if we had a decimal, add it back
if (decimalIndex != -1)
numS.insert(numS.begin() + decimalIndex, '.');
return atof(numS.c_str());
最佳答案
这永远行不通,因为 double
不是 十进制类型。截断你认为是一定数量的十进制数字只会在最后引入一组新的笑话数字。它甚至可能是有害的:例如0.125
是一个精确的 double
,但 0.12
和 0.13
都不是。
如果你想使用小数,那么使用小数类型,或者一个大的整数类型,约定它的一部分包含小数部分。
关于C++ 设置 double (不用于输出),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46426142/