web-dev-qa-db-fra.com

Cast Double to Integer en Java

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"

313
4lex1v

Une Double n'est pas une Integer, donc la distribution ne fonctionnera pas. Notez la différence entre Doubleclass et doubleprimitive. 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.

426
hvgotcodes

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;
517
anubhava

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.

Stratégie:

Pour convertir une Double en une Integer, vous devez suivre cette stratégie:

  1. Convertissez l'objet Double en une primitive double. (= "unboxing")
  2. Convertissez la primitive double en une primitive int. (= "casting")
  3. Reconvertit la primitive int en un objet Integer. (= "boxe")

Dans du code:

// 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

Pièges:

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:

  • 1/0 = + infini 
  • -1/0 = -infinity
  • 0/0 = non défini (NaN)

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);

Auto (dé) boxe

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

Préférer valueOf:

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
38
bvdb

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
37
squit

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.

21
Michael Scheper

Comme ça: 

Double foo = 123.456;
Integer bar = foo.intValue();
20
Richard Schwartz
double a = 13.34;
int b = (int) a;

System.out.println(b); //prints 13
13
conflittimat

Faites-le simplement de cette façon ...

Double d = 13.5578;
int i = d.intValue();
System.out.println(i);
6
Sunil Sharma
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());
6
manocha_ak

Appelez intValue() sur votre objet Double.

5

Essaye celui-là

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

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.

3
Sarthak Bhatia

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.

2
OnResolve

Utilisez la méthode doubleNumber.intValue();.

0
PanTau

Utilisez simplement la méthode intValue de Double

Double initialValue = 7.12;
int finalValue = initialValue.intValue();
0
ravi ranjan

Mémoire efficace, car il partagera l'instance de Double déjà créée.

Double.valueOf(Math.floor(54644546464/60*60*24*365)).intValue()
0
Ravinder Payal