与前导零的整数

时间:2009-02-19 14:49:29

标签: java numbers

当我写System.out.println(0123);时,我得到83System.out.println((int)0123F);打印123

为什么这样做?

8 个答案:

答案 0 :(得分:83)

八进制(基数为8)

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

数字1010L0101L不是二进制表示(只是为了避免混淆)。
这些数字是十进制表示。

即使按照Oracle docs中的正则表达式模式,

也是如此
  

\ 0n是具有八进制值0n(0 <= n <= 7)的字符   \ xhh是十六进制值为0xhh

的字符

因此,0101Integer格式的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.