Est-il possible de lancer un casting java.lang.Double
sur java.lang.Integer
?
Il jette une exception
"java.lang.ClassCastException: java.lang.Double incompatible avec java.lang.Integer"
A Double
n'est pas un Integer
, donc le casting ne fonctionnera pas. Notez la différence entre la Double
classe et la double
primitive . Notez également que a Double
est un Number
, il a donc la méthode intValue
que vous pouvez utiliser pour obtenir la valeur en tant que primitive int
.
intValue()
alors.intValue()
, cela transforme simplement ledouble
en anint
.Vous devez obtenir explicitement la valeur int en utilisant la méthode intValue () comme ceci:
Ou
la source
2^31 - 1 (Integer.MAX_VALUE)
débordera.1.6 -> 1
,1.4 -> 1
,-1.6 -> -1
,-1.4 -> -1
,Je pense qu'il est impossible de comprendre les autres réponses sans couvrir les pièges et raisonner derrière.
Vous ne pouvez pas directement convertir
Integer
unDouble
objet en objet. AussiDouble
etInteger
sont des objets immuables, vous ne pouvez donc pas les modifier en aucune façon.Chaque classe numérique a une alternative primitive (
Double
vsdouble
,Integer
vsint
, ...). Notez que ces primitives commencent par un caractère minuscule (par exempleint
). Cela nous dit qu'ils ne sont pas des classes / objets. Ce qui signifie également qu'ils n'ont pas de méthodes. En revanche, les classes (par exempleInteger
) agissent comme des boîtes / wrappers autour de ces primitives, ce qui permet de les utiliser comme des objets.Stratégie:
Pour convertir un
Double
en un,Integer
vous devez suivre cette stratégie:Double
objet en primitivedouble
. (= "déballage")double
en primitiveint
. (= "casting")int
enInteger
objet. (= "boxe")Dans du code:
En fait, il y a un raccourci. Vous pouvez décompresser immédiatement d'une
Double
ligne droite à une primitiveint
. De cette façon, vous pouvez ignorer complètement l'étape 2.Pièges:
Cependant, il y a beaucoup de choses qui ne sont pas couvertes dans le code ci-dessus. Le code ci-dessus n'est pas null-safe.
Maintenant, cela fonctionne bien pour la plupart des valeurs. Cependant, les entiers ont une très petite plage (valeur min / max) par rapport à a
Double
. En plus de cela, les doubles peuvent également contenir des "valeurs spéciales", que les entiers ne peuvent pas:Ainsi, selon l'application, vous souhaiterez peut-être ajouter un filtrage pour éviter les exceptions désagréables.
Ensuite, la prochaine lacune est la stratégie d'arrondi. Par défaut, Java arrondira toujours vers le bas. L'arrondi est parfaitement logique dans tous les langages de programmation. Fondamentalement, Java jette simplement certains des octets. Dans les applications financières, vous voudrez sûrement utiliser l'arrondissement de moitié (par exemple:
round(0.5) = 1
etround(0.4) = 0
).Boxe (dé) automatique
Vous pourriez être tenté d'utiliser la boxe (dé) automatique , mais je ne le ferais pas. Si vous êtes déjà coincé maintenant, les exemples suivants ne seront pas aussi évidents. Si vous ne comprenez pas le fonctionnement interne de la (dé) boxe automatique, alors ne l'utilisez pas.
Je suppose que ce qui suit ne devrait pas être une surprise. Mais si c'est le cas, vous voudrez peut-être lire un article sur la diffusion en Java.
Préférez valueOf:
Aussi, ne soyez pas tenté d'utiliser le
new Integer()
constructeur (comme le proposent d'autres réponses). LesvalueOf()
méthodes sont meilleures car elles utilisent la mise en cache. C'est une bonne habitude d'utiliser ces méthodes, car de temps en temps, elles vous feront économiser de la mémoire.la source
Je vois trois possibilités. Les deux premiers coupent les chiffres, le dernier arrondit à l'entier le plus proche.
la source
Comme ça:
la source
En effet, la manière la plus simple est d'utiliser
intValue()
. Cependant, cela renvoie simplement la partie entière; il ne fait aucun arrondi. Si vous voulez que l'entier soit le plus proche de la valeur Double, vous devrez le faire:Et n'oubliez pas le cas nul:
Math.round()
gère les cas de canard impairs, comme l'infini et NaN, avec une grâce relative.la source
la source
Faites-le simplement de cette façon ...
la source
Il faut également ajouter que cela fonctionne avec la boîte automatique.
Sinon, vous obtenez un int (primitif), puis vous pouvez obtenir un entier à partir de là:
la source
new Integer(int)
plutôtInteger.valueOf(int)
, qui a un cache pour les petits entiers, comme celui-ci.intValue()
Faites appel à votreDouble
objet.la source
Vous pouvez le faire en utilisant "Conversion de type étroite ou explicite", double → long → int. J'espère que ça marchera.
PS: Il donnera 0 car le double a toutes les valeurs décimales et rien sur le côté gauche. Dans le cas de 0,58, il le réduira à 0. Mais pour d'autres, il fera la magie.
la source
Essaye celui-là
la source
Double et Integer sont des classes wrapper pour les primitives Java pour double et int respectivement. Vous pouvez lancer entre ceux-ci, mais vous perdrez la virgule flottante. C'est-à-dire que 5.4 converti en entier sera 5. Si vous le restituez, ce sera 5.0.
la source
Utilisez simplement la méthode intValue de Double
la source
Utilisez la
doubleNumber.intValue();
méthode.la source
Mémoire efficace, car elle partagera l'instance déjà créée de Double.
la source
Math.floor(...)
?intValue()
toujours des planchers de toute façon.Ça a marché pour moi. Essaye ça:
la source