Como posso converter um longo para int em Java?

Respostas:

371

Atualizado, em Java 8:

Math.toIntExact(value);

Resposta original:

A conversão de tipo simples deve fazer isso:

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

Observe, no entanto, que números grandes (geralmente maiores que 2147483647e menores que -2147483648) perderão alguns bits e seriam representados incorretamente.

Por exemplo, 2147483648seria representado como -2147483648.

Frxstrem
fonte
Qual é a precisão de números inteiros? o_O
khachik
3
@khachik Eu acho que a precisão é 1. Ou talvez 42 é claro :)
extraneon
7
A transmissão tem significados diferentes para objetos e tipos primitivos. (int) l não tenta tratar um número inteiro de 64 bits como um número inteiro de 32 bits, na verdade, retorna um número inteiro diferente de 32 bits com os mesmos 32 bits de ordem inferior. Com objetos, você transmite para uma classe filho mais específica, mas com tipos primitivos, um elenco não é realmente um elenco, mas uma conversão.
Dspyz 06/12/10
Int x = (int) (((longo) inteiro.MAX_INTEGER) +10); Se uma conversão não detectar nesse caso que x tem um valor inadequado, você não terá uma solução.
raisercostin
Math.toIntExact () é um ótimo método, na verdade. Emite uma exceção se o valor for muito grande para caber em um int. Obrigado pela sugestão.
Java-addict301 22/05/19
182
Long x = 100L;
int y = x.intValue();

Laxman
fonte
3
Eu diria que este será o melhor caminho.
Simmant
Qual é a diferença entre esse caminho e simplesmente lançar o valor? Eu acho que tudo o que intValue()faz aqui no fundo está lançando o valor .. Certo?
Tim Wißmann
1
Observe os tipos. Não é um primitivo longaqui. É o tipo de referência Longque não pode ser convertido diretamente em um primitivo int. int y = (int)x;lançará uma execução, mas int y = (int)(long)xfuncionará. (A razão é autoboxing)
Akop
58

Para valores pequenos, a conversão é suficiente:

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

No entanto, um longpode conter mais informações que um int, portanto, não é possível converter perfeitamente de longpara int, no caso geral. Se o longnúmero tiver um número menor ou igual a Integer.MAX_VALUEvocê, você poderá convertê-lo lançando sem perder nenhuma informação.

Por exemplo, o seguinte código de exemplo:

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

produz a seguinte saída na minha máquina:

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

Observe o sinal negativo y. Como xmantinha um valor maior que Integer.MAX_VALUE, int ynão foi possível mantê-lo. Nesse caso, ele volta para os números negativos.

Se você quiser lidar com esse caso, faça algo como:

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

Tudo isso assume números positivos. Para números negativos, use em MIN_VALUEvez de `MAX_VALUE '

mndrix
fonte
Portanto, uma conversão adequada será detectar se a conversão é segura e lançar uma exceção caso contrário. Fato declarado por @Andrej Herich que sugeriu a biblioteca Guava.
raisercostin
55

Desde o Java 8, você pode usar: Math.toIntExact (valor longo)

Consulte JavaDoc: Math.toIntExact

Retorna o valor do argumento longo; lançando uma exceção se o valor exceder um valor int.

Código fonte de Math.toIntExactno JDK 8:

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

Se estiver usando biblioteca de goiaba , existem métodos Ints.checkedCast(long)e Ints.saturatedCast(long)para converter longa int.

Andrej Herich
fonte
4
Não há necessidade de usar bibliotecas
Grekz 16/01
6
@Grekz isso depende do OP. Eu faria neste caso. Mais jarros de dependência são melhores do que rodas reinventadas, a menos que você tenha um motivo real para não ter mais jarros de dependência.
precisa saber é o seguinte
1
IMHO, esta resposta é muito melhor do que a aceita, pois nunca faz algo inesperado.
Mark Slater
5
Desde o meu projeto já incluir esse jar, seria mais benéfico para usá-lo do que escrever um novo helper
Osify
24
long x = 3;
int y = (int) x;

mas isso pressupõe que o longpode ser representado como um int, você sabe a diferença entre os dois?

Theo
fonte
6
É interessante saber que, de acordo com o par 5.1.3 em java.sun.com/docs/books/jls/third_edition/html/… (a especificação da linguagem Java): Apesar do fato de que estouro, estouro ou outra perda de informação pode ocorrer, restringir conversões entre tipos primitivos nunca resulta em uma exceção em tempo de execução (§11).
extraneon
19

Você pode usar o Longwrapper em vez de longprimitivo e chamar

Long.intValue()

Documentos Java7 intValue ()

Arredonda / trunca o longvalor de acordo para caber em um int.

eleonzx
fonte
Pode ser uma boa idéia vincular à documentação atual, bem como expandir isso - inevitavelmente, haverá algum grau de arredondamento ao converter um tempo longo para um int.
Makoto
2
Olhando para a implementação do Long.intValue () em Java 7, está apenas lançando. Nenhuma verificação de sub / transbordamento é implementada. Portanto, pelo menos através do Java 7, essa opção é equivalente a apenas: (int) someLong.
buzz3791
por que menos votos positivos? Achei esta uma das respostas mais valiosas
Anand j. Kadhi
3

Se a transmissão direta mostrar erro, você poderá fazer o seguinte:

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

Em Java, long é um número assinado de 64 bits, o que significa que você pode armazenar números entre -9.223.372.036.854.775.808 e 9.223.372.036.854.775.807 (inclusive).

Um int, por outro lado, é assinado com um número de 32 bits, o que significa que você pode armazenar um número entre -2.147.483.648 e 2.147.483.647 (inclusive).

Portanto, se o seu comprimento estiver fora dos valores permitidos para um int, você não receberá uma conversão valiosa.

Detalhes sobre tamanhos de tipos Java primitivos aqui:

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

Alexis Dufrenoy
fonte
1
A pergunta já estava respondida no momento em que a vi, mas o assunto dos limites da conversão não foi explicado. O que eu fiz então. Se você acha que é "bla bla bla", isso significa apenas que você é algum tipo de gênio que pode ficar sem esse tipo de coisa, mas para nós, meros seres humanos, uma explicação pode ser útil. Obrigado por sua "entrada" ...
Alexis Dufrenoy
1

No Java 8 eu faço da seguinte maneira

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

Este método lança ArithmaticExceptionse o longvalor exceder o intervalo de int. Portanto, estou seguro de perda de dados.

Emdadul Sawon
fonte
0

Se você deseja fazer uma conversão segura e aproveitar o uso do Java8 com expressão Lambda, use-o como:

val -> Optional.ofNullable(val).map(Long::intValue).orElse(null)
user13651274
fonte
Você quer dizer declarar isso como Function<Long,Integer> function =?
Scratte
-1

x longo = 3120L; // aceita qualquer valor longo int z = x.intValue (); // você pode converter double em int também da mesma maneira

se você precisar se esconder diretamente,

longvalue.intvalue ();

MANOJ G
fonte
Isso está errado, 3.120 não é longo, é um número de ponto duplo ou flutuante.
George Xavier
-4
Long l = 100;
int i = Math.round(l);
Kristijan Drača
fonte
-7

Na primavera, existe uma maneira rigorosa de converter um tempo para int

não apenas o lnog pode converter em int, qualquer tipo de classe estende Number pode converter para outro tipo de Number em geral, aqui mostrarei como converter um comprimento em int, outro tipo vice-versa.

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

converter tempo em int

tsaowe
fonte
6
Spring pode ser Java, mas Java não é Spring. "Em java, existe" é uma declaração falsa.
Gordon