Une manière de convertir Java.lang.Double
en Java.lang.Integer
?
Il jette une exception
"Java.lang.ClassCastException: Java.lang.Double incompatible avec Java.lang.Integer"
Une Double
n'est pas une Integer
, donc la distribution ne fonctionnera pas. Notez la différence entre Double
class et double
primitive. Notez également que Double
est une Number
, elle a donc la méthodeintValue
, que vous pouvez utiliser pour obtenir la valeur sous forme d'une primitive int
.
Vous devez explicitement obtenir la valeur int en utilisant la méthode intValue () comme ceci:
Double d = 5.25;
Integer i = d.intValue(); // i becomes 5
Ou
double d = 5.25;
int i = (int) d;
Je pense qu'il est impossible de comprendre les autres réponses sans couvrir les pièges et raisonnements derrière ceux-ci.
Vous ne pouvez pas convertir directement une Integer
en un objet Double
. De plus, Double
et Integer
sont des objets immuables, vous ne pouvez donc pas les modifier.
Chaque classe numérique a une primitive alternative (Double
contre double
, Integer
contre int
, ...). Notez que ces primitives commencent par un caractère minuscule (par exemple int
). 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 exemple, Integer
) agissent comme des boîtes/enveloppeurs autour de ces primitives, ce qui permet de les utiliser comme des objets.
Pour convertir une Double
en une Integer
, vous devez suivre cette stratégie:
Double
en une primitive double
. (= "unboxing")double
en une primitive int
. (= "casting")int
en un objet Integer
. (= "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);
En fait, il y a un raccourci. Vous pouvez défaire immédiatement d'une Double
directement à une primitive int
. De cette façon, vous pouvez ignorer entièrement l'étape 2.
Double myDouble = Double.valueOf(10.0);
Integer val = Integer.valueOf(myDouble.intValue()); // the simple way
Cependant, beaucoup de choses ne sont pas couvertes par le code ci-dessus . Le code ci-dessus est not null-safe.
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());
Maintenant, cela fonctionne bien pour la plupart des valeurs. Cependant, les entiers ont une très petite plage (valeur min/max) par rapport à Double
. En plus de cela, les doubles peuvent aussi contenir des "valeurs spéciales", que les entiers ne peuvent pas:
Ainsi, en fonction de l'application, vous souhaiterez peut-être ajouter un filtrage pour éviter les Exceptions désagréables.
Ensuite, la stratégie suivante est la stratégie d'arrondi. Par défaut, Java sera toujours arrondi. Arrondir est parfaitement logique dans tous les langages de programmation. Fondamentalement, Java ne fait que jeter certains octets. Dans les applications financières, vous voudrez sûrement utiliser l’arrondissement à moitié (par exemple: round(0.5) = 1
et round(0.4) = 0
).
// null-safe and with better rounding
long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = Integer.valueOf(rounded);
Vous pourriez être tenté d'utiliser auto- (dé) boxe dans ceci, mais je ne le ferais pas. Si vous êtes déjà bloqué maintenant, les prochains exemples ne seront pas aussi évidents. Si vous ne comprenez pas les rouages de la boxe automatique, ne l'utilisez pas.
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)
Je suppose que ce qui suit ne devrait pas être une surprise. Mais si c'est le cas, vous pouvez lire un article sur le casting en Java.
double val7 = (double) 10; // works
Double val8 = (Double) Integer.valueOf(10); // doesn't work
Integer val9 = (Integer) 9; // pure nonsense
De même, ne soyez pas tenté d'utiliser le constructeur new Integer()
(comme le proposent d'autres réponses). Les méthodes valueOf()
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.
long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = new Integer(rounded); // waste of memory
Je vois trois possibilités. Les deux premiers coupent les chiffres, le dernier arrondit à l'entier le plus proche.
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
En effet, le moyen le plus simple consiste à utiliser intValue()
. Cependant, cela retourne simplement la partie entière; il ne fait aucun arrondi. Si vous voulez que la valeur Integer la plus proche de la valeur Double soit utilisée, procédez comme suit:
Integer integer = Integer.valueOf((int) Math.round(myDouble)));
Et n'oubliez pas le cas nul:
Integer integer = myDouble == null ? null : Integer.valueOf((int) Math.round(myDouble)));
Math.round()
traite les caisses de canard impaires, comme l'infini et NaN, avec une grâce relative.
Comme ça:
Double foo = 123.456;
Integer bar = foo.intValue();
double a = 13.34;
int b = (int) a;
System.out.println(b); //prints 13
Faites-le simplement de cette façon ...
Double d = 13.5578;
int i = d.intValue();
System.out.println(i);
Double d = 100.00;
Integer i = d.intValue();
Il faut aussi ajouter que cela fonctionne avec la sélection automatique.
Sinon, vous obtenez un int (primitif) et pouvez ensuite obtenir un Integer à partir de là:
Integer i = new Integer(d.intValue());
Appelez intValue()
sur votre objet Double
.
Essaye celui-là
double doubleValue = 6.5;Double doubleObj = new Double(doubleValue);int intResult = doubleObj.intValue();
Vous pouvez le faire en utilisant "Conversion de type restreint ou explicite", Double → long → int. J'espère que ça va marcher.
double d = 100.04;
long l = (long)d; // Explicit type casting required
int i = (int)l; // Explicit type casting required
PS: Cela donnera 0 comme le double a toutes les valeurs décimales et rien du côté gauche. Dans le cas de 0.58, il sera réduit à 0. Mais pour les autres, il fera la magie.
Double et Integer sont des classes wrapper pour les primitives Java de double et int, respectivement. Vous pouvez choisir entre ceux-ci, mais vous perdrez le point flottant. C'est-à-dire que 5,4 converti en un entier sera 5. Si vous le rejetez, ce sera 5,0.
Utilisez la méthode doubleNumber.intValue();
.
Utilisez simplement la méthode intValue de Double
Double initialValue = 7.12;
int finalValue = initialValue.intValue();
Mémoire efficace, car il partagera l'instance de Double déjà créée.
Double.valueOf(Math.floor(54644546464/60*60*24*365)).intValue()