为什么会出现这种情况?
long value = 123450;
System.out.println("value: " + value);
价值:123450
long value = 0123450;
// ^
System.out.println("value: " + value);
价值:42792
这是什么42792?
答案 0 :(得分:7)
为什么会出现这种情况?
正如以0x
开头的文字被视为十六进制数字(基数为16),以0
开头的文字被视为octal numbers,即基数为8的数字。
(尝试编写0789,你会看到编译器会抱怨。)
这是什么42792?
基数8中的数字123450表示数字
1 ×8 5 + 2 ×8 4 + 3 × 8 3 + 4 ×8 2 + 5 ×8 1 + 0 ×8 0 = 42792
答案 1 :(得分:5)
如果在数字前加零,则理解为八进制(基数为8)。但是,println将它写在基数10中。
123450八进制= 42792十进制。
答案 2 :(得分:5)
这就是java代表八进制文字的方式。看看这个:
http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
如果您想要的是在左侧打印带零的内容,则需要使用 DecimalFormat 格式方法。
http://download.oracle.com/javase/6/docs/api/java/text/DecimalFormat.html
在这种情况下,你这样做:
long value = 123450;
DecimalFormat df = new DecimalFormat("0");
System.out.println("value: " + df.format(value));
答案 3 :(得分:3)
Octal literal。有关Java编号文字的详细描述(尽管有点干),请参阅Java语言规范3.10.1。要查找和学习更多有趣的东西,请参阅“Java益智游戏”book。
答案 4 :(得分:0)
此功能可以追溯到'C'早期。前导'0'表示八进制,前导'0x'表示十六进制。已经提出'0b'用于JDK 7的二进制数。
您可以使用Integer.decode(String)
解析这样的数字,该数字也接受前导'#'作为河西十进制数。