Qualquer forma de elenco java.lang.Double
para java.lang.Integer
?
Isso lança uma exceção
"java.lang.ClassCastException: java.lang.Double incompatível com java.lang.Integer"
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 odouble
para umint
.Você precisa obter explicitamente o valor int usando o método intValue () como este:
Ou
fonte
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 umDouble
objeto. TambémDouble
eInteger
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
vsdouble
,Integer
vsint
, ...). Observe que essas primitivas começam com um caractere minúsculo (por exemploint
). 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 exemploInteger
) agem como caixas / invólucros em torno dessas primitivas, o que torna possível usá-las como objetos.Estratégia:
Para converter um
Double
em um,Integer
você precisa seguir esta estratégia:Double
objeto em um primitivodouble
. (= "unboxing")double
em um primitivoint
. (= "transmissão")int
volta em umInteger
objeto. (= "boxe")Em código:
Na verdade, há um atalho. Você pode desembalar imediatamente de um
Double
direto para um primitivoint
. Dessa forma, você pode pular a etapa 2 completamente.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.
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
eround(0.4) = 0
).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.
Eu acho que o seguinte não deve ser uma surpresa. Mas, se for, você pode ler um artigo sobre transmissão em Java.
Preferir valorDe:
Além disso, não fique tentado a usar o
new Integer()
construtor (como algumas outras respostas propõem). OsvalueOf()
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.fonte
Eu vejo três possibilidades. Os dois primeiros cortam os dígitos, o último arredonda para o número inteiro mais próximo.
fonte
Como isso:
fonte
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:E não esqueça o caso nulo:
Math.round()
lida com casos estranhos de patos, como infinito e NaN, com relativa graça.fonte
fonte
Simplesmente faça desta maneira ...
fonte
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í:
fonte
new Integer(int)
, em vez disso, useInteger.valueOf(int)
um cache para números inteiros pequenos, como este.Chame
intValue()
seuDouble
objeto.fonte
Você pode fazer isso usando "Conversão de tipo restrito ou explícito", duplo → longo → int. Espero que funcione.
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.
fonte
Tente este
fonte
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.
fonte
Basta usar o método intValue de Double
fonte
Use o
doubleNumber.intValue();
métodofonte
Memória eficiente, pois compartilhará a instância já criada do Double.
fonte
Math.floor(...)
?intValue()
sempre andares de qualquer maneira.Funcionou para mim. Tente o seguinte:
fonte