如何计算整数的小数位数?
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
我写了一个程序来确定数字中的位数
#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
的结果是可以预期的。
要准确(并且可能更快)计算整数中的位数,您应该使用整数方法来计算位数。有多种技术,例如