带前导零的长变量输出问题

3

我不明白为什么在长数字变量前导零的情况下会出现这样的输出。

public class Test{
        public static void main(String[] args) {
             long var1=00123l;
             long var2=123l;
             System.out.println("Variable 1--->"+var1);
             System.out.println("Variable 2--->"+var2);
             System.out.println(var1==var2);
        }
    }

输出:

Variable 1--->83
Variable 2--->123
false

1
前导零表示八进制记数法。 - jlordo
5个回答

7
当一个数字字面量前缀为0时,Java 会将其视为八进制数。当你打印相同的数时,默认情况下它会以十进制(即 base(10))格式打印。因此,00123l 会被打印成 83

2
好的,谢谢。但是你知道有没有一种方法可以停止在十进制格式下进行转换吗?如果没有,请纠正我。因为有些情况下我会遇到这样的值。所以我必须手动删除那些前导零。有时候在预览中也需要显示前导零。那么我该如何处理这种情况呢? - bNd
你可以使用以下语法将八进制数打印出来:int num = 032;System.out.printf("%04o", num);注意:如果你同时使用八进制和十进制数字,请小心。确保你的其他计算不会受到影响。 - codeMan

7

前导零将00123l转换为八进制字面量,而1238=8310

来自JLS

八进制数字由ASCII数字0后跟一个或多个ASCII数字0到7交错使用下划线组成,可以表示正数、零或负整数。

当你打印该值时,它以十进制打印,因此你看到83


谢谢,你提供的规范很有帮助+1。我已经在@CodeMan处添加了一条评论。除了格式化输出,还有其他解决方案吗? - bNd
@Bhumika:说实话,我不完全理解你要解决的问题。这些文字是从哪里来的?你需要用它们做什么? - NPE
好的,排序解释完了之后,我想把一个长整型变量视为长整型,即使有前导零也是如此。所以没有任何办法。有一种情况是变量用于计算和预览。由于前导零,计算结果会出错,如果我去掉前导零,预览结果也会出错。你知道我们可以通过逻辑来解决这个问题,但是有一种标准的方法来解决它。因此,在我接受答案之前,我想知道是否存在可能的解决方案。 - bNd
@Bhumika:如果这个数字来自你的代码之外,那么你只需将其作为一个字符串读取,然后使用 Integer.valueOf(s, 10) 即可。这将把它作为十进制处理,无论有多少前导零。 - NPE

4

当你在数值前面添加一个零时,它会被解释为八进制的数值。

整数不能存储任何前导零。如果需要这些零,请将数字存储为字符串。


2

当你在整数字面值前添加了前导零时,它被解释为一个八进制数字。00123在八进制中是83在十进制中。


0

0012301230123l在Java中都是相同的。你可以测试一下。它们是八进制数。如果你将它们转换,你会发现(1X8^2)+(1X8^1)(1X8^0)=64+16+3=83。如果你想的话,你可以将它们存储为字符串。


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