web-dev-qa-db-fra.com

Entier avec des zéros au début

Lorsque j'écris System.out.println(0123);, je reçois 83 mais System.out.println((int)0123F); imprime 123.

Pourquoi ça marche comme ça?

43
IAdapter

Octal (numéro de base 8)

0123 signifie octal 123, c'est-à-dire 1 * 8 * 8 + 2 * 8 + 3, ce qui équivaut à 83 ..__ Pour une raison quelconque, les flottants octaux ne sont pas disponibles.

Créer 0123 signifie un entier 83 . Créer 0123F signifie un 123 flottant. Une fois reconverti en entier, il reste 123.

Juste n'utilisez pas le 0 devant si vous ne voulez pas dire octal. Après tout, ils ne sont pas vraiment utiles (et les programmeurs qui connaissent les nombres octaux deviendront confus quand ils verront 09F).

83
luiscubal

Parce que les littéraux entiers commençant par 0 sont traités comme des nombres octaux.

Voir la section 3.10.1 du JLS

14
toolkit

Essaye ça:

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"
9
ryeguy

Les octales (0) et hexadécimaux (0x) ont été hérités de C .

System.out.println(0x123);
4
Peter Lawrey

le premier imprimé en 83, car Java prend 0123 en tant que nombre octal et imprime un équivalent décimal de ce nombre.

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

Les nombres 1010L et 0101L ne sont pas en représentation binaire (juste pour éviter la confusion).
Ces nombres sont en représentation décimale.

Même selon les modèles de Regex dans Oracle docs ,

\ 0n est le caractère de valeur octale 0n (0 <= n <= 7) 
\xhh est le caractère avec la valeur hexadécimale 0xhh

Ainsi, votre numéro 0101 que ce soit au format Integer ou Long est traité comme une représentation octale d’un nombre. 

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
1
Devendra Lattu

printf le fera: 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();
    }
}

Vous pouvez également le rendre "%0" + size + "%d" si vous souhaitez modifier la longueur ... bien que si les longueurs étaient communes, je ferais probablement des constantes telles que "%04d", "%012d", etc ...

0
TofuBeer

En Java, les entiers avec un zéro sont des entiers octaux (base 8).

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

Donc, n'utilisez aucun nombre commençant par 0 si vous ne voulez pas le traiter comme un nombre octal.

Tout nombre avec le suffixe 'F' est alors traité comme un nombre flottant.

Dans l'exemple donné, (inf)0123F imprime 123 car 0123F traitée comme float (123) et convertie en valeur int reste 123.

0
Anil Satija