Come posso convertire un long in int in Java?


Risposte:


371

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 2147483647e più piccoli di -2147483648) perderanno alcuni dei bit e verrebbero rappresentati in modo errato.

Ad esempio, 2147483648sarebbe rappresentato come -2147483648.


Qual è la precisione degli interi? o_O
khachik il

3
@khachik Penso che la precisione sia 1. O forse 42 ovviamente :)
extraneon

7
Il casting ha significati diversi per gli oggetti e per i tipi primitivi. (int) l non tenta di trattare un numero intero a 64 bit come un numero intero a 32 bit, in realtà restituisce un numero intero a 32 bit diverso con gli stessi 32 bit di ordine inferiore. Con gli oggetti, esegui il cast in una classe figlio più specifica, ma con i tipi primitve, un cast non è in realtà un cast, ma una conversione.
dspyz,

Int x = (int) (((Long) Integer.MAX_INTEGER) +10); Se una conversione non rileva in questo caso che x ha un valore improprio, allora non hai una soluzione.
raisercostin,

Math.toIntExact () è in realtà un ottimo metodo. Genera ed eccezione se il valore è troppo grande per rientrare in un int. Grazie per il suggerimento
java-addict301

182
Long x = 100L;
int y = x.intValue();


3
Direi che questo sarà il modo migliore.
Simmant

Qual è la differenza tra questo modo e semplicemente il cast del valore? Penso che tutto ciò che intValue()fa qui in background sia esprimere il valore .. Giusto?
Tim Wißmann,

1
Nota i tipi. Non è un primitivo longqui. È il tipo di riferimento Longche non può essere lanciato direttamente su una primitiva int. int y = (int)x;genererà un'esecuzione ma int y = (int)(long)xfunzionerà. (Il motivo è l'autoboxing)
akop

58

Per valori piccoli, il casting è sufficiente:

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

Tuttavia, a longpuò contenere più informazioni di an int, quindi non è possibile convertire perfettamente da longa int, nel caso generale. Se il longdetiene 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 xun 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_VALUEinvece di `MAX_VALUE '


Quindi una conversione corretta sarà quella di rilevare se la conversione è sicura e generare un'eccezione in caso contrario. Fatto dichiarato da @Andrej Herich che ha suggerito la biblioteca di Guava.
raisercostin,

55

Da Java 8 è possibile utilizzare: Math.toIntExact (valore lungo)

Vedi JavaDoc: Math.toIntExact

Restituisce il valore dell'argomento lungo; generare un'eccezione se il valore trabocca un int.

Codice sorgente di Math.toIntExactin JDK 8:

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

37

Se si utilizza la libreria Guava , ci sono metodi Ints.checkedCast(long)e Ints.saturatedCast(long)per la conversione longin int.


4
Non è necessario utilizzare le librerie
Grekz il

6
@Grekz dipende dall'OP. Vorrei in questo caso. Più vasetti di dipendenza sono meglio di più ruote reinventate a meno che non si abbia un motivo effettivo per non avere più vasetti di dipendenza.
Djechlin,

1
IMHO, questa risposta è molto meglio di quella accettata, in quanto non fa mai qualcosa di inaspettato.
Mark Slater,

5
Dal momento che il mio progetto include già quel vaso, sarebbe più utile usarlo che scrivere un nuovo aiutante
Osify,

24
long x = 3;
int y = (int) x;

ma questo presuppone che il longpuò essere rappresentato come un int, conosci la differenza tra i due?


6
È interessante sapere che secondo il par. 5.1.3 in java.sun.com/docs/books/jls/third_edition/html/… (The Java Language Spec): Nonostante il fatto che overflow, underflow o altre perdite di informazioni possano si verificano, restringendo le conversioni tra tipi primitivi non si ottiene mai un'eccezione di runtime (§11).
extraneon

19

Puoi usare il Longwrapper invece di longprimitive e call

Long.intValue()

Documenti intValue () Java7

Arrotonda / tronca il longvalore di conseguenza per adattarsi a un int.


Potrebbe essere una buona idea collegarsi alla documentazione corrente, così come espandere su questo - inevitabilmente, ci sarà un certo grado di arrotondamento quando si converte un long in un int.
Makoto,

2
Guardando l'implementazione Java 7 di Long.intValue (), è solo il casting. Non viene implementato il controllo under / overflow. Quindi almeno attraverso Java 7, questa opzione equivale a solo: (int) someLong.
buzz3791,

perché meno voti? Ho trovato questa una delle risposte più preziose
Anand j. Kadhi,

3

Se il casting diretto mostra un errore, puoi farlo in questo modo:

Long id = 100;
int int_id = (int) (id % 100000);

2

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


1
La domanda aveva già una risposta al momento in cui l'ho vista, ma l'argomento dei limiti della conversione non è stato spiegato. Che ho fatto allora. Se pensi che sia "bla bla bla", ciò significa solo che sei una specie di genio che può andare senza quel tipo di cose, ma per noi, semplici umani, una spiegazione può essere utile. Grazie per il tuo "input" ...
Alexis Dufrenoy,

1

In Java 8 lo faccio nel modo seguente

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

Questo metodo genera ArithmaticExceptionse il longvalore supera l'intervallo di int. Quindi sono al sicuro dalla perdita di dati.


0

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)

Intendi dichiararlo come Function<Long,Integer> function =?
Scratte

-1

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 ();


Questo è sbagliato, 3.120 non è un lungo, è un numero doppio o in virgola mobile.
George Xavier,


-7

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);

converti long in int


6
Spring potrebbe essere Java, ma Java non è Spring. "In java, c'è" è un'affermazione falsa.
Gordon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.