为什么带前导零的整数文本解释得很奇怪?

vc6uscn9  于 2021-07-12  发布在  Java
关注(0)|答案(8)|浏览(214)

这是83号

System.out.println(0123)

但是这是123

System.out.println(123)

为什么会这样?

rbl8hiat

rbl8hiat1#

前导零表示文字是用八进制(以8为基数的数字)表示的。
0123可以通过 (1 * 8 * 8) + (2 * 8) + (3) ,小数点后等于83。由于某些原因,八进制浮点数不可用。
如果不想用八进制表示文字,就不要使用前导零。
还有一个 0x 表示文字以十六进制(以16为基数)表示的前缀。

yzuktlbb

yzuktlbb2#

因为以 0 被视为八进制数。
见jls第3.10.1节

hsvhsicv

hsvhsicv3#

试试这个:

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"
qeeaahzv

qeeaahzv4#

第一个打印为83,因为java将0123作为八进制数,并打印与该数字等价的十进制数。

at0kjp5o

at0kjp5o5#

八进制(前导0)和十六进制(前导0x)是从c继承的。比较一下,试试看

System.out.println(0x123);
628mspwn

628mspwn6#

0123 -> 83
1010L -> 1010  
0101L -> 65

数字 1010L 以及 0101L 不是二进制表示(只是为了避免混淆)。
这些数字用十进制表示。
即使按照oracle文档中的正则表达式模式,
\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
tzxcd3kk

tzxcd3kk7#

在java中,前导为零的整数是八进制整数(基8)。

(1 * 8^2) + (2 * 8^1) + (3 * 8^0) = 83

所以如果你不想把它当作八进制数,就不要用任何以0开头的数字。

wnrlj8wa

wnrlj8wa8#

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" 等等。。。

相关问题