我试图获取双精度小数点后的位数。目前,我的代码如下所示:
int num_of_decimal_digits = 0;
while (someDouble - someInt != 0)
{
someDouble = someDouble*10;
someInt = someDouble;
num_of_decimal_digits++;
}
每当我输入一个小于1的someDouble的小数时,循环就会卡住并无限重复。我应该使用static_cast吗?有什么建议吗?
答案 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。我建议您分享更多关于您希望使用此代码完成的内容的背景信息(您的输入和所需的输出)。对于你想要完成的事情,可能有更好的解决方案。