一个整数前面有零是什么意思,如何打印它?

7
class test{
  public static void main(String args[]){
     int a = 011;
     System.out.println(a);
  }
}

为什么输出结果是9而不是011

如何获得输出结果011


String.format("%02d", a) - MadProgrammer
1
011是八进制字面量,在十进制中为9=(8^1+8^0)。更多详情请参见https://dev59.com/2Ww05IYBdhLWcg3weBvu#7218803。 - cobarzan
以0开头的数字被称为十六进制数。 - SmashCode
@SmashCode 不完全正确。在Java中,以前导“0”编写的数字称为八进制,它们是基于8的(octa-是希腊语前缀,表示8)。以前导“0x”编写的数字称为十六进制(简称hex),它们是基于16的(hexa-是希腊语前缀,表示6,而deci-是拉丁语前缀,表示10)。常规数字称为十进制,因为它们是基于10的。八进制和十六进制很有用,因为它们比十进制更容易转换为二进制。 - cbarrick
3个回答

9

JLS 3.10.1 描述了定义整数的四种方式。

整数字面值可以使用 十进制(基数为10)、十六进制(基数为16)、八进制(基数为8)或者二进制(基数为2)进行表示。

八进制数字由数字0后跟一个或多个数字0到7组成...

十进制数字要么是单个数字0,代表整数零,要么是由数字1到9中的一个数字,后面可选地跟上一个或多个数字0到9...

总之,如果您的整数字面值(即011)以0开头,则 Java 将假定它是八进制表示法

octal conversion example

解决方案:

如果你想让你的整数保持值为11,那么不要太花哨,直接赋值11即可。毕竟,符号对于值来说并没有改变什么。我的意思是,从数学角度来看,11 = 011 = 11.0。

int a = 11;

格式仅在打印时(或将您的int转换为String时)才有影响。
String with3digits = String.format("%03d", a);
System.out.println(with3digits);

格式化符号"%03d"用于添加前导零。

formatter

或者,您可以使用printf方法在1行中完成它。

System.out.printf("%03d", a);

2

以数字0开头的数值被解析为八进制数(即基数为8)。011在八进制中表示9。


1
011被解释为八进制数字,意味着它是基于8的。参见此SO帖子。来自Stuart Cook的被接受答案中说到:
在Java和其他几种语言中,以0开头的整数文字被解释为八进制(基数为8)数量。
十进制中的数字:
100s、10s、1s
八进制中的数字:
64s、8s、1s
所以011被解释为8+1=9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接