当我写System.out.println(0123);
时,我得到83
但System.out.println((int)0123F);
打印123
。
为什么这样做?
答案 0 :(得分:83)
0123表示octal 123,即1 * 8 * 8 + 2 * 8 + 3,等于83。 由于某种原因,八通浮标不可用。
创建0123表示整数83。 创建0123F表示浮动123.当转换回整数时,它仍然是123。
如果你不是指八进制,请不要使用前导0。毕竟,它们并不完全有用(当你看到09F时,了解八进制数的程序员会感到困惑。)
答案 1 :(得分:14)
因为以0
开头的整数文字被视为八进制数。
参见JLS
的第3.10.1节答案 2 :(得分:9)
试试这个:
public static String leftPad(int n, int padding) {
return String.format("%0" + padding + "d", n);
}
leftPad(5, 3); // return "005"
leftPad(15, 5); // return "00015"
leftPad(224, 3); // return "224"
leftPad(0, 4); // return "0000"
答案 3 :(得分:4)
第一个打印为83,因为java将0123作为八进制数,并打印出该数字的十进制等值。
答案 4 :(得分:4)
八进制(前导0)和十六进制(前导0x)是从C继承的。 为了比较,请尝试
System.out.println(0x123);
答案 5 :(得分:1)
0123 -> 83
1010L -> 1010
0101L -> 65
数字1010L
和0101L
不是二进制表示(只是为了避免混淆)。
这些数字是十进制表示。
即使按照Oracle docs中的正则表达式模式,
也是如此\ 0n是具有八进制值0n(0 <= n <= 7)的字符 \ xhh是十六进制值为0xhh
的字符
因此,0101
或Integer
格式的Long
号码将被视为数字的八进制表示形式。
123 => 1 * 8^2 + 2 * 8^1 + 1 * 8^0 = 83
0101 => 1 * 8^2 + 0 * 8^1 + 1 * 8^0 = 64 + 0 + 1 = 65
答案 6 :(得分:0)
printf
会这样做:http://java.sun.com/developer/technicalArticles/Programming/sprintf/
public class X
{
public static void main(final String[] argv)
{
System.out.printf("%04d", 123);
System.out.println();
}
}
如果你想改变长度,你也可以使它成为"%0" + size + "%d"
......但如果长度很常见,我可能会制作"%04d"
,"%012d"
等常量。 ..
答案 7 :(得分:0)
在Java中,前导零的整数文字是八进制整数(基数为8)。
1 * 8^2 + 2 * 8 + 8 = 83
因此,如果您不想将其视为八进制数,请不要使用任何以0为前导的数字。
任何后缀为“F”的数字都将被视为浮点数。
在给定示例中,(inf)0123F
将打印123
,因为0123F被视为float(123)并转换为int值仍为123.