如何计算整数的小数位数?

How to count decimal digits of an integer?

我写了一个程序来确定数字中的位数

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    long long num1 = 1999999999999999;
    long long num2 = 9999999999999999;
    int number_of_digit_1 = log10(num1) + 1;
    int number_of_digit_2 = log10(num2) + 1;
    cout << number_of_digit_1 << endl;
    cout << number_of_digit_2 << endl;
}

输出是这样的

16 
17

尽管它应该打印相同的数字 (16)。为什么会这样?

log10(long long int) 未定义。然后,num2 隐式转换为精度较低的 double。将 num2 转换为 long double 即可解决问题。

此解决方法不适用于 visual studio(那里,double = long double)。但是,它适用于 gcc 和 clang。

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    long long num1 = 1999999999999999;
    long long num2 = 9999999999999999;
    long double x = static_cast<long double> (num2);
    int number_of_digit_1 = log10(num1) + 1;
    int number_of_digit_2 = log10(num2) + 1;
    int number_of_digit_3 = log10(x) + 1;
    cout << number_of_digit_1 << endl;
    cout << number_of_digit_2 << endl;
    cout << number_of_digit_3 << endl;
}

另一种可能性是使用一个简单的专用函数来计算位数,并使用一个简单的 while 循环。一般情况下,效率高不是问题。

template <typename T> 
int n_digits (T num) {
    int n = 0;
    while (num != 0) {
        ++n;
        num /= 10;
    }
    return n;
}

log10 将各种浮点类型作为参数,returns 在其结果中采用相同的类型。在您的情况下,它正在转换为 double.

double 整数(有效数)部分只有 53 位。

9999999999999999需要54位才能准确表示。

当您将 9999999999999999 转换为 double 时,您会得到 10000000000000000,因此 log10(9999999999999999)16 的结果是可以预期的。

要准确(并且可能更快)计算整数中的位数,您应该使用整数方法来计算位数。有多种技术,例如 or http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog