Risposte:
Aggiornato, in Java 8:
Math.toIntExact(value);
Risposta originale:
La fusione di tipo semplice dovrebbe farlo:
long l = 100000;
int i = (int) l;
Si noti, tuttavia, che numeri grandi (di solito più grandi di 2147483647
e più piccoli di -2147483648
) perderanno alcuni dei bit e verrebbero rappresentati in modo errato.
Ad esempio, 2147483648
sarebbe rappresentato come -2147483648
.
Long x = 100L;
int y = x.intValue();
intValue()
fa qui in background sia esprimere il valore .. Giusto?
long
qui. È il tipo di riferimento Long
che non può essere lanciato direttamente su una primitiva int
. int y = (int)x;
genererà un'esecuzione ma int y = (int)(long)x
funzionerà. (Il motivo è l'autoboxing)
Per valori piccoli, il casting è sufficiente:
long l = 42;
int i = (int) l;
Tuttavia, a long
può contenere più informazioni di an int
, quindi non è possibile convertire perfettamente da long
a int
, nel caso generale. Se il long
detiene un numero inferiore o uguale aInteger.MAX_VALUE
te, puoi convertirlo lanciando senza perdere alcuna informazione.
Ad esempio, il seguente codice di esempio:
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);
produce il seguente output sulla mia macchina:
largest long is 9223372036854775807
largest int is 2147483647
long x=2147483648
int y=-2147483648
Si noti il segno negativo attivato y
. Perché ha x
un valore maggiore di Integer.MAX_VALUE,int y
non è stato possibile mantenerlo. In questo caso si è avvolto attorno ai numeri negativi.
Se vuoi gestire questo caso da solo, potresti fare qualcosa del tipo:
if ( x > (long)Integer.MAX_VALUE ) {
// x is too big to convert, throw an exception or something useful
}
else {
y = (int)x;
}
Tutto ciò presuppone numeri positivi. Per i numeri negativi, utilizzare MIN_VALUE
invece di `MAX_VALUE '
Da Java 8 è possibile utilizzare: Math.toIntExact (valore lungo)
Restituisce il valore dell'argomento lungo; generare un'eccezione se il valore trabocca un int.
Codice sorgente di Math.toIntExact
in JDK 8:
public static int toIntExact(long value) {
if ((int)value != value) {
throw new ArithmeticException("integer overflow");
}
return (int)value;
}
Se si utilizza la libreria Guava , ci sono metodi Ints.checkedCast(long)
e Ints.saturatedCast(long)
per la conversione long
in int
.
long x = 3;
int y = (int) x;
ma questo presuppone che il long
può essere rappresentato come un int
, conosci la differenza tra i due?
Puoi usare il Long
wrapper invece di long
primitive e call
Long.intValue()
Arrotonda / tronca il long
valore di conseguenza per adattarsi a un int
.
Se il casting diretto mostra un errore, puoi farlo in questo modo:
Long id = 100;
int int_id = (int) (id % 100000);
In Java, un long è un numero a 64 bit con segno, il che significa che è possibile memorizzare numeri compresi tra -9.223.372.036.854.775.808 e 9.223.372.036.854.775.807 (incluso).
Un int, invece, ha un numero a 32 bit, il che significa che è possibile memorizzare un numero compreso tra -2.147.483.648 e 2.147.483.647 (incluso).
Quindi se il tuo long è al di fuori dei valori consentiti per un int, non otterrai una conversione preziosa.
Dettagli sulle dimensioni dei tipi di Java primitivi qui:
http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
In Java 8 lo faccio nel modo seguente
long l = 100L;
int i = Math.toIntExact(l);
Questo metodo genera ArithmaticException
se il long
valore supera l'intervallo di int
. Quindi sono al sicuro dalla perdita di dati.
Se vuoi fare una conversione sicura e goderti l'uso di Java8 con l'espressione Lambda Puoi usarlo come:
val -> Optional.ofNullable(val).map(Long::intValue).orElse(null)
Function<Long,Integer> function =
?
lungo x = 3120L; // accetta qualsiasi valore lungo int z = x.intValue (); // puoi convertire double in int anche allo stesso modo
se hai bisogno di nascondere direttamente allora
longvalue.intvalue ();
Long l = 100;
int i = Math.round(l);
In primavera, esiste un modo rigoroso per convertire un long in int
non solo lnog può convertire in int, qualsiasi tipo di classe si estende Numero può convertire in altro tipo di numero in generale, qui ti mostrerò come convertire un lungo in int, altro tipo viceversa.
Long l = 1234567L;
int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l, Integer.class);