Cast Double à Entier En Java

comment lancer java.lang.Double à java.lang.Integer ?

il jette une exception

" java.lang.ClassCastException: java.lang.Double incompatible avec java.lang.Entier "

293
demandé sur Bhesh Gurung 2012-02-01 23:53:18

17 réponses

Un Double n'est pas un Integer , de sorte que la distribution ne fonctionne pas. Notez la différence entre les Double classe et le double primitive . Notez également qu'un Double est un Number , donc il a la méthode intValue , que vous pouvez utiliser pour obtenir la valeur comme une primitive int .

399
répondu hvgotcodes 2018-09-29 21:38:54

vous devez obtenir explicitement 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;
490
répondu anubhava 2013-07-17 18:49:17

je vois trois possibilités. Les deux premiers coupent les chiffres, le dernier tourne vers 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
36
répondu squit 2013-11-15 09:53:14

je pense qu'il est impossible de comprendre les autres réponses sans couvrir les pièges et raisonnements derrière elle.

vous ne pouvez pas lancer directement un Integer sur un objet Double . Aussi Double et Integer sont des objets immuables, de sorte que vous ne pouvez pas les modifier. Cependant chaque classe numérique a un primitif alternative ( Double vs double , Integer vs int ,...).

notez que ces primitives commencent avec un caractère en minuscules (par exemple int ), qui nous dit en fait qu'elles ne sont pas des classes/objets. Ce qui signifie également qu'ils n'ont pas les méthodes.

stratégie:

pour convertir un Double en un Integer vous devez suivre cette stratégie:

  1. convertir la Double objet à une primitive double . (="unboxing")
  2. convertissez le primitif double en un primitif int . (="casting")
  3. convertissez le primitif int de retour à un objet Integer . (= "la boxe")

dans le 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 passer immédiatement d'un Double directement à un int primitif . De cette façon, vous pouvez sauter l'étape 2 entièrement.

Double myDouble = Double.valueOf(10.0);
Integer val = Integer.valueOf(myDouble.intValue()); // the simple way

pièges:

cependant, il y a beaucoup de choses qui ne sont pas couvertes dans le code ci-dessus. Le code-ci-dessus est Non 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, il fonctionne très bien pour la plupart des valeurs. Cependant, les entiers ont une très petite portée (valeur min/max) par rapport à un Double . En plus de cela, les doubles peuvent aussi tenir des "valeurs spéciales", que les entiers ne peut pas:

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

ainsi, selon l'application, vous pouvez vouloir ajouter un certain filtrage pour éviter de mauvaises Exceptions.

ensuite, la prochaine lacune est la stratégie d'arrondissement. Par défaut, Java va toujours arrondir vers le bas. Arrondir vers le bas est parfaitement logique dans tous les langages de programmation. Fondamentalement Java jette juste quelques 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-(onu)de la boxe

vous pourriez être tenté d'utiliser auto - (un) boxe dans ceci, mais je ne le ferais pas. Si vous êtes déjà coincé maintenant, alors les prochains exemples ne seront pas si évident non plus. Si vous ne comprenez pas le fonctionnement interne de l'auto - (un)boxe alors s'il vous plaît ne pas l'utiliser.

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, alors vous voudrez peut-être 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èrent valueOf:

aussi, ne soyez pas tenté d'utiliser le constructeur new Integer() (comme d'autres réponses le proposent). Les méthodes valueOf() sont meilleures parce qu'elles utilisent la mise en cache. C'est une bonne habitude d'utiliser ces méthodes, car de temps à le temps ils vous feront économiser un peu de mémoire.

long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = new Integer(rounded); // waste of memory
36
répondu bvdb 2018-07-18 12:35:24

en effet, la manière la plus simple est d'utiliser intValue() . Cependant, cela renvoie simplement la partie entière; il ne fait pas d'arrondissement. Si vous voulez L'entier le plus proche de la valeur Double, vous aurez besoin de faire ceci:

Integer integer = Integer.valueOf((int) Math.round(myDouble)));

et n'oubliez pas le cas null:

Integer integer = myDouble == null ? null : Integer.valueOf((int) Math.round(myDouble)));

Math.round() s'occupe de cas de canards impairs, comme l'infini et NaN, avec une relative grâce.

21
répondu Michael Scheper 2015-02-13 00:31:07

comme ceci:

Double foo = 123.456;
Integer bar = foo.intValue();
20
répondu Richard Schwartz 2012-02-01 20:00:24
double a = 13.34;
int b = (int) a;

System.out.println(b); //prints 13
13
répondu conflittimat 2013-03-11 12:39:42
Double d = 100.00;
Integer i = d.intValue();

, il faut ajouter qu'il fonctionne avec l'autoboxing.

sinon, vous obtenez un int (primitif) et puis vous pouvez obtenir un entier de là:

Integer i = new Integer(d.intValue());
6
répondu manocha_ak 2017-06-04 22:06:38

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

Double d = 13.5578;
int i = d.intValue();
System.out.println(i);
6
répondu Sunil Sharma 2017-06-04 22:07:23

Appel intValue() sur votre Double objet.

5
répondu Alejandro Pablo Tkachuk 2016-07-31 20:00:34

vous pouvez faire cela en utilisant " rétrécissement ou Conversion de type explicite", double → long → int. J'espère que cela va fonctionner.

double d = 100.04;
long l = (long)d; // Explicit type casting required
int i = (int)l;    // Explicit type casting required

PS: il donnera 0 comme double a toutes les valeurs décimales et rien sur le côté gauche. Dans le cas de 0.58, il sera réduit à 0. Mais pour d'autres, il va faire de la magie.

3
répondu Sarthak Bhatia 2017-06-04 22:08:45

Essayer celui-ci

double doubleValue = 6.5;Double doubleObj = new Double(doubleValue);int intResult = doubleObj.intValue();
3
répondu Samantha de Silva 2018-04-04 20:53:39

Double et entier sont des classes d'enrubannage pour primitives Java pour double et int respectivement. Vous pouvez lancer entre ceux-ci, mais vous perdrez la pointe flottante. C'est, 5.4 coulé int sera de 5. Si vous le rejetez, il sera de 5.0.

2
répondu OnResolve 2017-06-04 22:05:44

il suffit D'utiliser la méthode intValue de Double

Double initialValue = 7.12;
int finalValue = initialValue.intValue();
0
répondu ravi ranjan 2015-06-12 07:18:05

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

0
répondu PanTau 2017-06-04 22:07:35

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

Double.valueOf(Math.floor(54644546464/60*60*24*365)).intValue()
0
répondu Ravinder Payal 2018-07-17 08:11:31

ça a marché pour moi. Essayez ceci:

double od = Double.parseDouble("1.15");
int oi = (int) od;
-2
répondu Andrey Lychok Lychov-Podvala 2018-02-11 19:20:28