确定双C++中的小数位数

Determining the number of decimal digits in a double - C++

本文关键字:小数 C++      更新时间:2023-10-16

我正在尝试获取双精度小数点后的位数。目前,我的代码如下:

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

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

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

while (abs(someDouble - someInt) < epsilon)

或者,您可以确认,尾数为53位的双精度只能表示log10253≈15.9位小数,并将循环限制为16次迭代。

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

或者两者兼而有之。

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

天真的答案是:

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,这是浮点数字以二进制存储的方式。我建议您分享更多关于您希望使用此代码实现的目标的背景信息(您的输入和期望的输出)。对于你试图实现的目标,可能有一个更好的解决方案。