Converter Double para Inteiro em Java

348

Qualquer forma de elenco java.lang.Doublepara java.lang.Integer?

Isso lança uma exceção

"java.lang.ClassCastException: java.lang.Double incompatível com java.lang.Integer"

4lex1v
fonte

Respostas:

464

A Doublenão é um Integer, então o elenco não funcionará. Observe a diferença entre a Double classe e o double primitivo . Observe também que a Doubleé a e Number, portanto, possui o método intValue , que você pode usar para obter o valor como primitivo int.

hvgotcodes
fonte
2
Ok, não para lançar. Eu preciso obter o objeto inteiro de Double, não 13.22222, mas 13, por exemplo.
4lex1v
181
basta ligar intValue()então.
Hvgotcodes
6
Não se esqueça de lidar com nulos.
Pimlottc
13
Observe que isso apenas retorna a parte inteira do Double; portanto, para 13.666667 ou 13.9, você receberá 13, e não 14. Se você quiser o número inteiro mais próximo , consulte a minha resposta: stackoverflow.com/a/24816336/1450294
Michael Scheper
2
se você olhar para a implementação de intValue(), ele apenas lança o doublepara um int.
Carlo.marinangeli
565

Você precisa obter explicitamente o valor int usando o método intValue () como este:

Double d = 5.25;
Integer i = d.intValue(); // i becomes 5

Ou

double d = 5.25;
int i = (int) d;
anubhava
fonte
67
Obrigado. Muito claro. A resposta aceita, para mim, parece repreender por fazer uma pergunta boba. Mas sua resposta é muito generosa.
Buddhika Ariyaratne
2
O que acontece quando o valor duplo está fora do intervalo inteiro? (like 2 ^ 33)
nikdeapen
5
Qualquer valor duplo> 2^31 - 1 (Integer.MAX_VALUE)será excedido.
Anubhava
3
E, a propósito, quando convertido de double para int, ele apenas mantém a parte inteira, tanto para números positivos quanto negativos, e não se importa com arredondamentos. por exemplo 1.6 -> 1, 1.4 -> 1, -1.6 -> -1, -1.4 -> -1,
Eric Wang
51

Eu acho que é impossível entender as outras respostas sem cobrir as armadilhas e o raciocínio por trás disso.

Você não pode converter diretamente um Integerem um Doubleobjeto. Também Doublee Integersão objetos imutáveis, então você não pode modificá-los de qualquer forma.

Cada classe numérica tem uma alternativa primitiva ( Doublevs double, Integervs int, ...). Observe que essas primitivas começam com um caractere minúsculo (por exemplo int). Isso nos diz que eles não são classes / objetos. O que também significa que eles não têm métodos. Por outro lado, as classes (por exemplo Integer) agem como caixas / invólucros em torno dessas primitivas, o que torna possível usá-las como objetos.

Estratégia:

Para converter um Doubleem um, Integervocê precisa seguir esta estratégia:

  1. Converta o Doubleobjeto em um primitivo double. (= "unboxing")
  2. Converta o primitivo doubleem um primitivo int. (= "transmissão")
  3. Converta a primitiva de intvolta em um Integerobjeto. (= "boxe")

Em código:

// starting point
Double myDouble = Double.valueOf(10.0);

// step 1: unboxing
double dbl = myDouble.doubleValue();

// step 2: casting
int intgr = (int) dbl;

// step 3: boxing
Integer val = Integer.valueOf(intgr);

Na verdade, há um atalho. Você pode desembalar imediatamente de um Doubledireto para um primitivo int. Dessa forma, você pode pular a etapa 2 completamente.

Double myDouble = Double.valueOf(10.0);
Integer val = Integer.valueOf(myDouble.intValue()); // the simple way

Armadilhas:

No entanto, existem muitas coisas que não são abordadas no código acima. O código acima não é seguro para nulos.

Double myDouble = null;
Integer val = Integer.valueOf(myDouble.intValue()); // will throw a NullPointerException

// a null-safe solution:
Integer val = (myDouble == null)? null : Integer.valueOf(myDouble.intValue());

Agora funciona bem para a maioria dos valores. No entanto, números inteiros têm um intervalo muito pequeno (valor mínimo / máximo) em comparação com a Double. Além disso, duplos também podem conter "valores especiais", que números inteiros não podem:

  • 1/0 = + infinito
  • -1/0 = -in infinito
  • 0/0 = indefinido (NaN)

Portanto, dependendo do aplicativo, você pode adicionar alguns filtros para evitar exceções desagradáveis.

Então, a próxima falha é a estratégia de arredondamento. Por padrão, o Java sempre será arredondado para baixo. O arredondamento faz todo o sentido em todas as linguagens de programação. Basicamente, o Java está apenas jogando fora alguns dos bytes. Em aplicações financeiras, você certamente desejará usar arredondamentos para metade (por exemplo: round(0.5) = 1e round(0.4) = 0).

// null-safe and with better rounding
long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = Integer.valueOf(rounded);

Auto- (des) boxe

Você pode ficar tentado a usar o auto- (des) boxe nisto, mas eu não usaria. Se você já está preso agora, os próximos exemplos também não serão tão óbvios. Se você não entender o funcionamento interno do auto- (des) boxe, não o utilize.

Integer val1 = 10; // works
Integer val2 = 10.0; // doesn't work

Double val3 = 10; // doesn't work
Double val4 = 10.0; // works

Double val5 = null; 
double val6 = val5; // doesn't work (throws a NullPointerException)

Eu acho que o seguinte não deve ser uma surpresa. Mas, se for, você pode ler um artigo sobre transmissão em Java.

double val7 = (double) 10; // works
Double val8 = (Double) Integer.valueOf(10); // doesn't work
Integer val9 = (Integer) 9; // pure nonsense

Preferir valorDe:

Além disso, não fique tentado a usar o new Integer()construtor (como algumas outras respostas propõem). Os valueOf()métodos são melhores porque eles usam cache. É um bom hábito usar esses métodos, porque de tempos em tempos eles economizam um pouco de memória.

long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = new Integer(rounded); // waste of memory
bvdb
fonte
11
esta na minha opinião é a melhor resposta
Thor
39

Eu vejo três possibilidades. Os dois primeiros cortam os dígitos, o último arredonda para o número inteiro mais próximo.

double d = 9.5;
int i = (int)d;
//i = 9

Double D = 9.5;
int i = Integer.valueOf(D.intValue());
//i = 9

double d = 9.5;
Long L = Math.round(d);
int i = Integer.valueOf(L.intValue());
//i = 10
squit
fonte
21
Não há necessidade de Integer.valueOf se você deseja armazenar o resultado em uma primitieve int. Seu código força o Java a executar uma caixa e uma caixa de remoção desnecessárias.
bvdb
23

Como isso:

Double foo = 123.456;
Integer bar = foo.intValue();
Richard Schwartz
fonte
23

De fato, a maneira mais simples é usar intValue(). No entanto, isso apenas retorna a parte inteira; não faz nenhum arredondamento. Se você deseja que o número inteiro mais próximo do valor duplo, faça o seguinte:

Integer integer = Integer.valueOf((int) Math.round(myDouble)));

E não esqueça o caso nulo:

Integer integer = myDouble == null ? null : Integer.valueOf((int) Math.round(myDouble)));

Math.round() lida com casos estranhos de patos, como infinito e NaN, com relativa graça.

Michael Scheper
fonte
2
Por que você precisa Integer.valueOf se você converter o resultado Math.round em int?
Erã H.
@EranH .: A partir do Java 1.5, você provavelmente não faz - autoboxing significa que o código provavelmente acaba fazendo a mesma coisa de qualquer maneira. Mas acho que esse código é mais claro para pessoas que ainda não entenderam objetos e primitivos.
quer
Quem votou negativamente nesta resposta: você ajudará muito mais a comunidade se explicar o porquê e pode até ajudá-lo a descobrir por que ela não funcionou para você. O voto negativo sem explicação, OTOH, é inútil para todos e parece covarde.
Michael Scheper
14
double a = 13.34;
int b = (int) a;

System.out.println(b); //prints 13
conflittimat
fonte
2
A pergunta era especificamente sobre as classes de wrapper. Esta resposta é sobre primitivos.
Michael Scheper
8

Simplesmente faça desta maneira ...

Double d = 13.5578;
int i = d.intValue();
System.out.println(i);
Sunil Sharma
fonte
7
Double d = 100.00;
Integer i = d.intValue();

Também se deve acrescentar que funciona com autoboxing.

Caso contrário, você obtém um int (primitivo) e pode obter um número inteiro a partir daí:

Integer i = new Integer(d.intValue());
manocha_ak
fonte
2
Não use new Integer(int), em vez disso, use Integer.valueOf(int)um cache para números inteiros pequenos, como este.
bvdb
6

Chame intValue()seu Doubleobjeto.

Alejandro Pablo Tkachuk
fonte
11
Parece uma repetição das respostas anteriores.
Pang
4

Você pode fazer isso usando "Conversão de tipo restrito ou explícito", duplo → longo → int. Espero que funcione.

double d = 100.04;
long l = (long)d; // Explicit type casting required
int i = (int)l;    // Explicit type casting required

PS: Dará 0, pois o dobro tem todos os valores decimais e nada no lado esquerdo. No caso de 0,58, o valor será reduzido a 0. Mas, para outros, ele fará a mágica.

Sarthak Bhatia
fonte
4

Tente este

double doubleValue = 6.5;Double doubleObj = new Double(doubleValue);int intResult = doubleObj.intValue();
Samantha de Silva
fonte
3

Double e Inteiro são classes de wrapper para primitivas Java para double e int, respectivamente. Você pode converter entre eles, mas perderá o ponto flutuante. Ou seja, 5.4 convertido para um int será 5. Se você convertê-lo de volta, será 5.0.

OnResolve
fonte
0

Basta usar o método intValue de Double

Double initialValue = 7.12;
int finalValue = initialValue.intValue();
Ravi Ranjan
fonte
2
Parece uma repetição das outras respostas.
Pang
0

Use o doubleNumber.intValue();método

PanTau
fonte
2
Parece uma repetição das outras respostas.
Pang
-1

Memória eficiente, pois compartilhará a instância já criada do Double.

Double.valueOf(Math.floor(54644546464/60*60*24*365)).intValue()
Ravinder Payal
fonte
existe alguma razão para o Math.floor(...)? intValue()sempre andares de qualquer maneira.
Bvdb
-2

Funcionou para mim. Tente o seguinte:

double od = Double.parseDouble("1.15");
int oi = (int) od;
Lychok, Andrey Lychov-Podvala
fonte