Comment convertir un long en int en Java?

316

Comment convertir un long en int en Java?

Arthur
la source
3
Copie

Réponses:

371

Mise à jour, en Java 8:

Math.toIntExact(value);

Réponse originale:

Le casting de type simple devrait le faire:

long l = 100000;
int i = (int) l;

Notez, cependant, qu'un grand nombre (généralement plus grand que 2147483647et plus petit que -2147483648) perdra certains des bits et serait représenté de manière incorrecte.

Par exemple, 2147483648serait représenté comme -2147483648.

Frxstrem
la source
Quelle est la précision des entiers? o_O
khachik
3
@khachik Je pense que la précision est 1. Ou peut-être 42 bien sûr :)
extraneon
7
Le casting a différentes significations pour les objets et pour les types primitifs. (int) l n'essaie pas de traiter un entier 64 bits comme un entier 32 bits, il retourne en fait un entier différent 32 bits avec les mêmes 32 bits d'ordre inférieur. Avec les objets, vous effectuez un cast vers une classe enfant plus spécifique, mais avec les types primitve, un cast n'est pas vraiment un cast, mais une conversion.
dspyz
Int x = (int) (((Long) Integer.MAX_INTEGER) +10); Si une conversion ne détecte pas dans ce cas que x a une valeur incorrecte, alors vous n'avez pas de solution.
raisercostin
Math.toIntExact () est en fait une excellente méthode. Il lève et exception si la valeur est trop grande pour tenir dans un int. Merci pour la suggestion.
java-addict301
182
Long x = 100L;
int y = x.intValue();

Laxman
la source
3
Je dirais que ce sera la meilleure façon.
Simmant
Quelle est la différence entre cette façon de faire et simplement la valeur ajoutée? Je pense que tout ce qui intValue()est ici en arrière-plan, c'est de donner de la valeur.
Tim Wißmann
1
Notez les types. Ce n'est pas une primitive longici. C'est le type de référence Longqui ne peut pas directement être converti en primitive int. int y = (int)x;lance une exception mais int y = (int)(long)xfonctionne. (La raison est la boxe automatique)
akop
58

Pour les petites valeurs, le casting suffit:

long l = 42;
int i = (int) l;

Cependant, un longpeut contenir plus d'informations qu'un int, il n'est donc pas possible de convertir parfaitement de longà int, dans le cas général. Si le longnombre contient un nombre inférieur ou égal à Integer.MAX_VALUEvous pouvez le convertir en lançant sans perdre aucune information.

Par exemple, l'exemple de code suivant:

System.out.println( "largest long is " + Long.MAX_VALUE );
System.out.println( "largest int is " + Integer.MAX_VALUE );

long x = (long)Integer.MAX_VALUE;
x++;
System.out.println("long x=" + x);

int y = (int) x;
System.out.println("int y=" + y);

produit la sortie suivante sur ma machine:

largest long is 9223372036854775807
largest int is 2147483647
long x=2147483648
int y=-2147483648

Remarquez le signe négatif y. Parce que xdétenait une valeur supérieure à Integer.MAX_VALUE, int yn'a pas pu la conserver. Dans ce cas, il s'est enroulé autour des nombres négatifs.

Si vous vouliez gérer ce cas vous-même, vous pourriez faire quelque chose comme:

if ( x > (long)Integer.MAX_VALUE ) {
    // x is too big to convert, throw an exception or something useful
}
else {
    y = (int)x;
}

Tout cela suppose des chiffres positifs. Pour les nombres négatifs, utilisez MIN_VALUEau lieu de «MAX_VALUE»

mndrix
la source
Ainsi, une conversion appropriée consistera à détecter si la conversion est sûre et à lever une exception dans le cas contraire. Fait déclaré par @Andrej Herich qui a suggéré la bibliothèque de goyave.
raisercostin
55

Depuis Java 8, vous pouvez utiliser: Math.toIntExact (valeur longue)

Voir JavaDoc: Math.toIntExact

Renvoie la valeur de l'argument long; lever une exception si la valeur déborde d'un int.

Code source de Math.toIntExactJDK 8:

public static int toIntExact(long value) {
    if ((int)value != value) {
        throw new ArithmeticException("integer overflow");
    }
    return (int)value;
}
Kuchi
la source
37

Si vous utilisez la bibliothèque Guava , il existe des méthodes Ints.checkedCast(long)et Ints.saturatedCast(long)pour convertir longen int.

Andrej Herich
la source
4
Il n'est pas nécessaire d'utiliser des bibliothèques
Grekz
6
@Grekz c'est à l'OP. Je le ferais dans ce cas. Plus de pots de dépendance est mieux que plus de roues réinventées, sauf si vous avez une raison réelle de ne pas avoir plus de pots de dépendance.
djechlin
1
À mon humble avis, cette réponse est bien meilleure que celle acceptée, en ce qu'elle ne fait jamais quelque chose d'inattendu.
Mark Slater
5
Étant donné que mon projet inclut déjà ce pot, il serait plus avantageux de l'utiliser que d'écrire un nouvel assistant
Osify
24
long x = 3;
int y = (int) x;

mais cela suppose que le longpeut être représenté comme un int, vous connaissez la différence entre les deux?

Théo
la source
6
Il est intéressant de savoir que, conformément au paragraphe 5.1.3 de java.sun.com/docs/books/jls/third_edition/html/… (The Java Language Spec): Malgré le fait que le débordement, le sous-débit ou toute autre perte d'informations peut se produisent, le rétrécissement des conversions entre les types primitifs n'entraîne jamais d'exception d'exécution (§11).
extraneon
19

Vous pouvez utiliser le Longwrapper au lieu de la longprimitive et appeler

Long.intValue()

Documents JavaV intValue ()

Il arrondit / tronque la longvaleur en conséquence pour tenir dans un int.

eleonzx
la source
Il peut être judicieux de créer un lien vers la documentation actuelle, ainsi que de l'étendre - inévitablement, il y aura un certain degré d'arrondi lors de la conversion d'un long en un entier.
Makoto
2
En regardant l'implémentation Java 7 de Long.intValue (), c'est juste du casting. Aucune vérification de sous / dépassement n'est implémentée. Donc, au moins via Java 7, cette option équivaut à simplement: (int) someLong.
buzz3791
pourquoi moins de votes positifs? J'ai trouvé celle-ci de la réponse la plus précieuse
Anand j. Kadhi
3

Si la diffusion directe montre une erreur, vous pouvez le faire comme ceci:

Long id = 100;
int int_id = (int) (id % 100000);
Mohammad H
la source
2

En Java, un long est un nombre signé de 64 bits, ce qui signifie que vous pouvez stocker des nombres compris entre -9 223 372 036 854 775 808 et 9 223 372 036 854 775 807 (inclus).

Un int, d'autre part, est un nombre signé de 32 bits, ce qui signifie que vous pouvez stocker un nombre compris entre -2 147 483 648 et 2 147 483 647 (inclus).

Donc, si votre long est en dehors des valeurs autorisées pour un int, vous n'obtiendrez pas une conversion valable.

Détails sur les tailles des types Java primitifs ici:

http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Alexis Dufrenoy
la source
1
La question était déjà répondue au moment où je l'ai vue, mais le sujet des limites de la conversion n'était pas expliqué. Ce que je fis alors. Si vous pensez que c'est "bla bla bla", cela signifie seulement que vous êtes une sorte de génie qui peut se passer de ce genre de chose, mais pour nous, simples humains, une explication peut être utile. Merci pour votre "entrée" ...
Alexis Dufrenoy
1

En Java 8, je fais de la manière suivante

long l = 100L;
int i = Math.toIntExact(l);

Cette méthode lance ArithmaticExceptionsi la longvaleur dépasse la plage de int. Ainsi je suis à l'abri de la perte de données.

Emdadul Sawon
la source
0

Si vous souhaitez effectuer une conversion sûre et profiter de l'utilisation de Java8 avec l'expression Lambda, vous pouvez l'utiliser comme:

val -> Optional.ofNullable(val).map(Long::intValue).orElse(null)
user13651274
la source
Tu veux dire le déclarer comme Function<Long,Integer> function =?
Scratte
-1

long x = 3120L; // prend n'importe quelle valeur longue int z = x.intValue (); // vous pouvez également convertir double en int de la même manière

si vous avez besoin de cacher directement alors

longvalue.intvalue ();

MANOJ G
la source
C'est faux, 3.120 n'est pas long, c'est un nombre double ou à virgule flottante.
George Xavier
-4
Long l = 100;
int i = Math.round(l);
Kristijan Drača
la source
-7

Au printemps, il existe un moyen rigoureux de convertir un long en int

non seulement lnog peut se convertir en int, tout type de classe étend Number peut être converti en un autre type Number en général, ici je vais vous montrer comment convertir un long en int, un autre type vice versa.

Long l = 1234567L;
int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l, Integer.class);

convertir long en entier

tsaowe
la source
6
Le printemps peut être Java, mais Java n'est pas le printemps. "En java, il y a" est une fausse déclaration.
Gordon