Целое число с ведущими нулями - PullRequest
46 голосов
/ 19 февраля 2009

Когда я пишу System.out.println(0123);, я получаю 83 однако System.out.println((int)0123F); печатает 123.

Почему это так работает?

Ответы [ 8 ]

83 голосов
/ 19 февраля 2009

Восьмеричное (основание-8 число)

0123 означает восьмеричное 123, то есть 1 * 8 * 8 + 2 * 8 + 3, что равно 83. По какой-то причине восьмеричные поплавки недоступны.

Создание 0123 означает целое число 83. Создание 0123F означает плавающее значение 123. При преобразовании обратно в целое число оно остается равным 123.

Только не используйте ведущий 0, если вы не имеете в виду восьмеричное. В конце концов, они не совсем полезны (и программисты, которые знают о восьмеричных числах, запутаются, когда увидят 09F).

14 голосов
/ 19 февраля 2009

Поскольку целочисленные литералы, начинающиеся с 0, обрабатываются как восьмеричные числа.

См. Раздел 3.10.1 JLS

9 голосов
/ 19 февраля 2009

Попробуйте это:

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"
4 голосов
/ 20 февраля 2009

Восьмеричное (ведущий 0) и шестнадцатеричное (ведущий 0x) были унаследованы от C. Для сравнения попробуйте

System.out.println(0x123);
4 голосов
/ 19 февраля 2009

первый напечатан как 83, потому что java принимает 0123 как восьмеричное число и печатает десятичный эквивалент этого числа.

1 голос
/ 04 мая 2017
0123 -> 83
1010L -> 1010  
0101L -> 65

Числа 1010L и 0101L не представлены в двоичном представлении (только во избежание путаницы).
Эти числа в десятичном представлении.

Даже согласно шаблонам регулярных выражений в Документах Oracle ,

\ 0n - это символ с восьмеричным значением 0n (0 <= n <= 7) <br> \ 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
0 голосов
/ 10 мая 2014

В Java целочисленные литералы с начальным нулем являются восьмеричными целыми (основание 8).

1 * 8^2 + 2 * 8 + 8 = 83

Так что не используйте любое число, начинающееся с 0, если вы не хотите рассматривать его как восьмеричное число.

Любое число с суффиксом 'F' будет рассматриваться как число с плавающей запятой.

В данном примере (inf)0123F напечатает 123, потому что 0123F, обработанный как число с плавающей точкой (123) и преобразованный в значение типа int, остается 123.

0 голосов
/ 19 февраля 2009

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" и т. Д. *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...