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


316

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


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.


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


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 '


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

37

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


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?


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.


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

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


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.


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)

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


Esto está mal, 3.120 no es largo, es un número doble o de coma flotante.
George Xavier


-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


66
Spring puede ser Java, pero Java no es Spring. "En Java, hay" es una declaración falsa.
Gordon
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.