¿Cómo puedo convertir un largo a int en Java?

316

¿Cómo puedo convertir un largo a int en Java?

Arturo
fuente
3
Posible duplicado de la
transmisión

Respuestas:

371

Actualizado, en Java 8:

Math.toIntExact(value);

Respuesta original

El tipo de conversión simple debería hacerlo:

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

Sin embargo, tenga en cuenta que los números grandes (generalmente más grandes 2147483647y más pequeños que -2147483648) perderán algunos de los bits y se representarán incorrectamente.

Por ejemplo, 2147483648se representaría como -2147483648.

Frxstrem
fuente
¿Cuál es la precisión de los enteros? o_O
khachik
3
@khachik Creo que la precisión es 1. O tal vez 42, por supuesto :)
extraneon
77
La fundición tiene diferentes significados para los objetos y para los tipos primitivos. (int) No trato de tratar un entero de 64 bits como un entero de 32 bits, en realidad devuelve un entero de 32 bits diferente con los mismos 32 bits de orden inferior. Con los objetos, se lanza a una clase secundaria más específica, pero con los tipos primitivos, un lanzamiento no es realmente un lanzamiento, sino una conversión.
dspyz
Int x = (int) (((Long) Integer.MAX_INTEGER) +10); Si una conversión no detecta en este caso que x tiene un valor incorrecto, entonces no tiene una solución.
raisercostin
Math.toIntExact () es un gran método en realidad. Lanza una excepción si el valor es demasiado grande para caber en un int. Gracias por la sugerencia.
java-addict301
182
Long x = 100L;
int y = x.intValue();

Laxman
fuente
3
Yo diría que esta será la mejor manera.
Simmant
¿Cuál es la diferencia entre esta forma y simplemente emitir el valor? Creo que todo lo que intValue()hace aquí en segundo plano es emitir el valor ... ¿Verdad?
Tim Wißmann
1
Tenga en cuenta los tipos. No es un primitivo longaquí. Es el tipo de referencia Longque no puede emitir directamente a una primitiva int. int y = (int)x;arrojará una ejecución pero int y = (int)(long)xfuncionará. (El motivo es el autoboxing)
akop
58

Para valores pequeños, el casting es suficiente:

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

Sin embargo, un longpuede contener más información que un int, por lo que no es posible convertir perfectamente de longa int, en el caso general. Si longtiene un número menor o igual a Integer.MAX_VALUEusted, puede convertirlo lanzando sin perder ninguna información.

Por ejemplo, el siguiente código de muestra:

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 el siguiente resultado en mi máquina:

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

Observe el signo negativo en y. Debido a que xtenía un valor uno mayor que Integer.MAX_VALUE, int yno se pudo retener. En este caso se envolvió con los números negativos.

Si desea manejar este caso usted mismo, puede hacer algo como:

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

Todo esto supone números positivos. Para números negativos, use en MIN_VALUElugar de `MAX_VALUE '

mndrix
fuente
Entonces, una conversión adecuada será detectar si la conversión es segura y lanzar una excepción de lo contrario. Hecho declarado por @Andrej Herich que sugirió la biblioteca Guava.
raisercostin
55

Desde Java 8 puede usar: Math.toIntExact (valor largo)

Ver JavaDoc: Math.toIntExact

Devuelve el valor del argumento largo; lanzando una excepción si el valor desborda un int.

Código fuente de Math.toIntExacten JDK 8:

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

Si usa la biblioteca Guava , hay métodos Ints.checkedCast(long)y Ints.saturatedCast(long)para convertir longa int.

Andrej Herich
fuente
44
No hay necesidad de usar bibliotecas
Grekz
66
@Grekz eso depende del OP. Lo haría en este caso. Más tarros de dependencia es mejor que ruedas más reinventadas a menos que tenga una razón real para no tener más tarros de dependencia.
djechlin
1
En mi humilde opinión, esta respuesta es mucho mejor que la aceptada, ya que nunca hace algo inesperado.
Mark Slater
55
Como mi proyecto ya incluye ese frasco, sería más beneficioso usarlo que escribir un nuevo ayudante
Osify
24
long x = 3;
int y = (int) x;

pero eso supone que longse puede representar como un int, ¿sabes la diferencia entre los dos?

Theo
fuente
66
Es interesante saber que, de acuerdo con el párrafo 5.1.3 en java.sun.com/docs/books/jls/third_edition/html/… (The Java Language Spec): a pesar del hecho de que el desbordamiento, el desbordamiento u otra pérdida de información pueden ocurrir, el estrechamiento de las conversiones entre tipos primitivos nunca da como resultado una excepción en tiempo de ejecución (§11).
extraneon
19

Puede usar el Longcontenedor en lugar de longprimitivo y llamar

Long.intValue()

Documentos de Java7 intValue ()

Redondea / trunca el longvalor en consecuencia para que quepa en un int.

eleonzx
fuente
Puede ser una buena idea vincular a la documentación actual, así como ampliar sobre esto; inevitablemente, habrá un cierto grado de redondeo al convertir un largo a un int.
Makoto
2
En cuanto a la implementación de Java 7 de Long.intValue (), es solo una conversión. No se implementa ninguna comprobación de bajo / desbordamiento. Entonces, al menos a través de Java 7, esta opción es equivalente a solo: (int) someLong.
buzz3791
¿Por qué menos votos a favor? Encontré esta una de las respuestas más valiosas
Anand j. Kadhi
3

Si la transmisión directa muestra un error, puede hacerlo así:

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

En Java, un largo es un número de 64 bits con signo, lo que significa que puede almacenar números entre -9,223,372,036,854,775,808 y 9,223,372,036,854,775,807 (inclusive).

Un int, por otro lado, es un número de 32 bits con signo, lo que significa que puede almacenar un número entre -2,147,483,648 y 2,147,483,647 (inclusive).

Entonces, si su tiempo está fuera de los valores permitidos para un int, no obtendrá una conversión valiosa.

Detalles sobre los tamaños de los tipos primitivos de Java aquí:

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

Alexis Dufrenoy
fuente
1
La pregunta ya estaba respondida en el momento en que la vi, pero no se explicó el tema de los límites de la conversión. Lo que hice entonces. Si crees que es "bla bla bla", eso solo significa que eres una especie de genio que puede prescindir de ese tipo de cosas, pero para nosotros, simples humanos, una explicación puede ser útil. Gracias por su "aporte" ...
Alexis Dufrenoy
1

En Java 8 lo hago de la siguiente manera

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

Este método arroja ArithmaticExceptionsi el longvalor excede el rango de int. Por lo tanto, estoy a salvo de la pérdida de datos.

Emdadul Sawon
fuente
0

Si desea realizar una conversión segura y disfrutar del uso de Java8 con expresión Lambda, puede usarlo como:

val -> Optional.ofNullable(val).map(Long::intValue).orElse(null)
usuario13651274
fuente
¿Te refieres a declararlo así Function<Long,Integer> function =?
Scratte
-1

largo x = 3120L; // tomar cualquier valor largo int z = x.intValue (); // puedes convertir double a int también de la misma manera

si necesita encubrir directamente entonces

longvalue.intvalue ();

MANOJ G
fuente
Esto está mal, 3.120 no es largo, es un número doble o de coma flotante.
George Xavier
-4
Long l = 100;
int i = Math.round(l);
Kristijan Drača
fuente
-7

En primavera, hay una forma rigurosa de convertir un largo a int

no solo lnog se puede convertir en int, cualquier tipo de clase se extiende El número se puede convertir a otro tipo de Número en general, aquí le mostraré cómo convertir un largo a int, otro tipo viceversa.

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

convertir largo a int

tsaowe
fuente
66
Spring puede ser Java, pero Java no es Spring. "En Java, hay" es una declaración falsa.
Gordon