确定double - C ++中的小数位数

时间:2014-10-24 22:25:48

标签: c++ while-loop double decimal static-cast

我试图获取双精度小数点后的位数。目前,我的代码如下所示:

int num_of_decimal_digits = 0;
while (someDouble - someInt != 0)
{
    someDouble = someDouble*10;
    someInt = someDouble;
    num_of_decimal_digits++;
}

每当我输入一个小于1的someDouble的小数时,循环就会卡住并无限重复。我应该使用static_cast吗?有什么建议吗?

2 个答案:

答案 0 :(得分:1)

由于浮点舍入误差,乘以10不一定是精确的十进制移位。您可以测试差异的绝对误差,而不是将其与0完全相等进行比较。

while (abs(someDouble - someInt) < epsilon)

或者您可以确认具有53位尾数的双精度数只能表示log 10 2 53 ≈15.9十进制数字,并将循环限制为16次迭代。

while (someDouble - someInt != 0 && num_of_decimal_digits < 16)

或两者兼而有之。

while (abs(someDouble - someInt) < epsilon && num_of_decimal_digits < 16)

答案 1 :(得分:0)

天真的答案是:

int num_of_decimal_digits = 0;
double absDouble = someDouble > 0 ? someDouble : someDouble * -1;
while (absDouble - someInt != 0)
{
    absDouble = absDouble*10;
    someInt = absDouble;
    num_of_decimal_digits++;
}

这解决了您的负数问题。

但是,由于表示浮点数的方式,此解决方案可能无法在很多情况下为您提供所需的输出。例如,0.35可能实际上表示为浮点数以二进制形式存储的方式为0.3499999999998。我建议您分享更多关于您希望使用此代码完成的内容的背景信息(您的输入和所需的输出)。对于你想要完成的事情,可能有更好的解决方案。