Java 检索数字的第一位

Java 检索数字的第一位,java,type-conversion,Java,Type Conversion,我只是在学习Java,并试图让我的程序检索数字的第一位数字-例如543应该返回5,等等。我想转换为字符串,但我不确定如何将其转换回?谢谢你的帮助 int number = 534; String numberString = Integer.toString(number); char firstLetterChar = numberString.charAt(0); int firstDigit = ???? Integer.parseInt将获取一个字符串并返回一个int int firs

我只是在学习Java,并试图让我的程序检索数字的第一位数字-例如543应该返回5,等等。我想转换为字符串,但我不确定如何将其转换回?谢谢你的帮助

int number = 534;
String numberString = Integer.toString(number);
char firstLetterChar = numberString.charAt(0);
int firstDigit = ????

Integer.parseInt
将获取一个字符串并返回一个int

int firstDigit = Integer.parseInt(Character.toString(firstLetterChar));
这应该使用数学而不是字符串来获取第一个数字

在您的示例log(543)=2.73中,转换为int的值是2。 功率(10,2)=100
543/100=5.43但由于它是一个int,因此它被截断为5,几乎肯定比使用字符串更有效:

int firstDigit(int x) {
    while (x > 9) {
        x /= 10;
    }
    return x;
}

(仅适用于非负整数。)

此示例适用于任何双精度整数,而不仅仅是正整数,并考虑负数或小于1的数字。例如,0.000053将返回5

private static int getMostSignificantDigit(double value) {
    value = Math.abs(value);
    if (value == 0) return 0;
    while (value < 1) value *= 10;
    char firstChar = String.valueOf(value).charAt(0);
    return Integer.parseInt(firstChar + "");
}
private static int getMostSignificantDigit(双精度值){
value=Math.abs(值);
如果(值==0)返回0;
而(值<1)值*=10;
char firstChar=String.valueOf(value).charAt(0);
返回整数.parseInt(firstChar+“”);
}
为了得到第一个数字,这需要字符串操作,因为它更容易阅读

int number = 534;
int firstDigit = number/100; 
java中的(/)运算符在不考虑提醒的情况下对数字进行除法,因此当我们将534除以100时,它给出(5)

但是,如果要获取最后一个数字,可以使用(%)运算符

    int lastDigit = number%10; 

这让我们想起了除法,因此534%10将产生数字4。

如果您不想使用str方法,这种方法可能更有意义

int first = 1;
for (int i = 10; i < number; i *= 10) {
    first = number / i;
}
int first=1;
对于(int i=10;i
你为什么喜欢使用numberString=“”+number而不是numberString=Integer.toString(number)?他只是懒得键入整件事:)@Dimitris True.)但是“+int=String”是一个Java习惯用法,“+int”是一个非常笨拙的习惯用法。它创建一个StringBuilder,向其追加一个空字符串,将int转换为字符串,将此字符串追加到StringBuilder,将StringBuilder转换为字符串。只说Integer.toString(n)或String.valueOf(n)效率更高。负数怎么办?在我的例子中,这个数永远不应该是负数,所以如果是负数,我不想把这个数乘以-1,然后像平常一样继续。@Ben Burnett:使用Abs代替将字符串操作作为基准看起来很有趣,但这样做有什么好处吗?如果我在读那行,而我不是数学教授,我就不知道它是干什么的:-)嗯,100的对数是2,999的对数是2.99,所以你可以看到,如果存储为int,日志返回的是位数减去1。位数告诉你数字除以什么。然后我们使用int的内置幂来截断小数点后的所有内容,留下第一个数字。但是我不能告诉你哪条路更快。我只是想提供一个不需要将数字转换为字符串的替代解决方案。不过,Math.pow对于int来说效率太低了;你们应该在那个里滚动你们自己的。它应该是log10,因为log是logbase 2,在数学库中。除数=(int)(Math.pow(10,(int)Math.log10(rem));leftdigit=(int)(rem*1.0/除数);老实说,这比其他地方所有深奥/过于复杂和算法的答案都要简单/实用得多,比如——也许这不会在一个有20位数字的大型机科学应用程序中扩展。。。但到底是谁在写这些东西呢?@Maysera,只添加代码的答案通常被认为是质量不好的帖子。它告诉其他人这段代码解决了问题的原因,但没有告诉其他人。请更新您的答案。@Mahrabuthraa我刚刚做了添加硬编码100失败了,543只是一个例子。所以,这是行不通的。这就像硬编码返回5。@srikanthnutigatu不,这不是“硬编码”。这适用于所有3位数的数字。返回5对666不起作用:D@MaysaraAlhindi不知道为什么我之前的评论会被标记为“硬编码”,为什么会假设它是一个3位数的数字?其中OP没有表示,为什么不把x转换成绝对值:x=x<0-x:进入循环前的x;那么它也适用于负数。@Ahmet除了Integer.MIN\u值之外。
int number = 534;
int firstDigit = number/100; 
    int lastDigit = number%10; 
int first = 1;
for (int i = 10; i < number; i *= 10) {
    first = number / i;
}