Respostas:
A Double
nã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
.
intValue()
então.
intValue()
, ele apenas lança o double
para um int
.
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;
2^31 - 1 (Integer.MAX_VALUE)
será excedido.
1.6 -> 1
, 1.4 -> 1
, -1.6 -> -1
, -1.4 -> -1
,
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 Integer
em um Double
objeto. Também Double
e Integer
são objetos imutáveis, então você não pode modificá-los de qualquer forma.
Cada classe numérica tem uma alternativa primitiva ( Double
vs double
, Integer
vs 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.
Para converter um Double
em um, Integer
você precisa seguir esta estratégia:
Double
objeto em um primitivo double
. (= "unboxing")double
em um primitivo int
. (= "transmissão")int
volta em um Integer
objeto. (= "boxe")// 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 Double
direto 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
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:
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) = 1
e round(0.4) = 0
).
// null-safe and with better rounding
long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = Integer.valueOf(rounded);
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
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
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
Como isso:
Double foo = 123.456;
Integer bar = foo.intValue();
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.
double a = 13.34;
int b = (int) a;
System.out.println(b); //prints 13
Simplesmente faça desta maneira ...
Double d = 13.5578;
int i = d.intValue();
System.out.println(i);
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());
new Integer(int)
, em vez disso, use Integer.valueOf(int)
um cache para números inteiros pequenos, como este.
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.
Tente este
double doubleValue = 6.5;Double doubleObj = new Double(doubleValue);int intResult = doubleObj.intValue();
Basta usar o método intValue de Double
Double initialValue = 7.12;
int finalValue = initialValue.intValue();
Memória eficiente, pois compartilhará a instância já criada do Double.
Double.valueOf(Math.floor(54644546464/60*60*24*365)).intValue()
Math.floor(...)
? intValue()
sempre andares de qualquer maneira.
Funcionou para mim. Tente o seguinte:
double od = Double.parseDouble("1.15");
int oi = (int) od;