为什么会发生这种行为?
long value = 123450;
System.out.println("value: " + value);
价值:123450
long value = 0123450;
// ^
System.out.println("value: " + value);
价值:42792
这是什么42792?
为什么会发生这种行为?
long value = 123450;
System.out.println("value: " + value);
价值:123450
long value = 0123450;
// ^
System.out.println("value: " + value);
价值:42792
这是什么42792?
为什么会发生这种行为?
正如以 开头的文字0x
被视为十六进制数(以 16 为基数)一样,以 a 开头的文字0
被视为八进制数,即以 8 为基数的数字。
(试着写 0789,你会发现编译器会报错。)
这是什么42792?
以 8 为底的数字 123450 代表数字
1 ×8 5 + 2 ×8 4 + 3 ×8 3 + 4 ×8 2 + 5 ×8 1 + 0 ×8 0 = 42792
如果您在数字前面加上零,则它被理解为八进制(以 8 为基数)。但是,println 以 10 为基数写入。
123450 八进制 = 42792 十进制。
这就是 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));
八进制文字。有关 Java 数字文字的详细描述,尽管有些枯燥,请参阅 Java Language Specification, 3.10.1。要查找和研究更多类似的有趣内容,请参阅“Java 谜题”一书。
此功能可以追溯到早期的“C”时代。前导“0”表示八进制,前导“0x”表示十六进制。有人建议将“0b”用于 JDK 7 的二进制数。
您可以解析这样一个数字,Integer.decode(String)
它也接受一个前导 '#' 作为十六进制数字。