有没有比这个方法更简洁的方法来获取整数的位数?
int numDigits = String.valueOf(1000).length();
有没有比这个方法更简洁的方法来获取整数的位数?
int numDigits = String.valueOf(1000).length();
当前回答
使用Java
int nDigits = Math.floor(Math.log10(Math.abs(the_integer))) + 1;
使用import java.lang.Math.*;一开始
使用C
int nDigits = floor(log10(abs(the_integer))) + 1;
在开始时使用include math.h
其他回答
玛丽安的解决方案,现在是三元:
public int len(int n){
return (n<100000)?((n<100)?((n<10)?1:2):(n<1000)?3:((n<10000)?4:5)):((n<10000000)?((n<1000000)?6:7):((n<100000000)?8:((n<1000000000)?9:10)));
}
因为我们可以。
或者相反,你可以检查这个数字是否大于或小于所需的数字。
public void createCard(int cardNumber, int cardStatus, int customerId) throws SQLException {
if(cardDao.checkIfCardExists(cardNumber) == false) {
if(cardDao.createCard(cardNumber, cardStatus, customerId) == true) {
System.out.println("Card created successfully");
} else {
}
} else {
System.out.println("Card already exists, try with another Card Number");
do {
System.out.println("Enter your new Card Number: ");
scan = new Scanner(System.in);
int inputCardNumber = scan.nextInt();
cardNumber = inputCardNumber;
} while(cardNumber < 95000000);
cardDao.createCard(cardNumber, cardStatus, customerId);
}
}
}
另一种字符串方法。简单明了,对于任意整数n。
int length = ("" + n).length();
这是我做的一个非常简单的方法,适用于任何数字:
public static int numberLength(int userNumber) {
int numberCounter = 10;
boolean condition = true;
int digitLength = 1;
while (condition) {
int numberRatio = userNumber / numberCounter;
if (numberRatio < 1) {
condition = false;
} else {
digitLength++;
numberCounter *= 10;
}
}
return digitLength;
}
它的工作方式是使用数字计数器变量,即10 = 1位空格。例如。1 = 1十分之一=> 1位空格。因此,如果你有int number = 103342;你会得到6,因为这相当于。000001个空格。还有,谁有更好的numberCounter变量名?我想不出比这更好的了。
编辑:我想到了一个更好的解释。本质上,这个while循环所做的就是让你的数字除以10,直到它小于1。从本质上讲,当你将一个数除以10时,你是在向后移动一个数字空间,所以你只需将它除以10,直到你的数字中的位数小于1。
下面是另一个版本,可以计算小数中的数字数量:
public static int repeatingLength(double decimalNumber) {
int numberCounter = 1;
boolean condition = true;
int digitLength = 1;
while (condition) {
double numberRatio = decimalNumber * numberCounter;
if ((numberRatio - Math.round(numberRatio)) < 0.0000001) {
condition = false;
} else {
digitLength++;
numberCounter *= 10;
}
}
return digitLength - 1;
}
下面是JDK开发人员给出的解决方案。JDK 17 (Long类):
/**
* Returns the string representation size for a given long value.
*
* @param x long value
* @return string size
*
* @implNote There are other ways to compute this: e.g. binary search,
* but values are biased heavily towards zero, and therefore linear search
* wins. The iteration results are also routinely inlined in the generated
* code after loop unrolling.
*/
static int stringSize(long x) {
int d = 1;
if (x >= 0) {
d = 0;
x = -x;
}
long p = -10;
for (int i = 1; i < 19; i++) {
if (x > p)
return i + d;
p = 10 * p;
}
return 19 + d;
}
注意,如果需要的话,该方法会考虑减号。
不幸的是,该方法没有公开。
在性能方面,您可以从评论中看到,JDK开发人员与其他选项相比至少考虑了这一点。我猜 分而治之的方法倾向于较小的数字,效果会稍好一些 更好,因为CPU可以比整数更快地进行整数比较 乘法。但这种差异可能小到无法测量。
无论如何,我希望JDK中已经公开了这个方法,这样人们就不会开始使用自己的方法了。