it-swarm.com.de

Double in Integer in Java umwandeln

Gibt es eine Möglichkeit, Java.lang.Double in Java.lang.Integer umzuwandeln? 

Es löst eine Ausnahme aus 

"Java.lang.ClassCastException: Java.lang.Double nicht kompatibel mit Java.lang.Integer"

313
4lex1v

Eine Double ist keine Integer, die Besetzung funktioniert also nicht. Beachten Sie den Unterschied zwischen Doubleclass und doubleprimitive. Beachten Sie auch, dass eine Double eine Number, ist. Daher verfügt sie über die MethodeintValue, die Sie verwenden können, um den Wert als Grundelement int abzurufen.

426
hvgotcodes

Sie müssen den int-Wert mithilfe der Methode intValue () wie folgt explizit abrufen:

Double d = 5.25;
Integer i = d.intValue(); // i becomes 5

Oder 

double d = 5.25;
int i = (int) d;
517
anubhava

Ich denke, es ist unmöglich, die anderen Antworten zu verstehen, ohne die Fallstricke und die Argumentation dahinter zu behandeln.

Sie können ein Integer nicht direkt in ein Double-Objekt umwandeln. Auch Double und Integer sind unveränderliche Objekte, daher können Sie sie in keiner Weise ändern. 

Jede numerische class hat eine primitive - Alternative (Double vs double, Integer vs int, ...). Beachten Sie, dass diese Grundelemente mit einem Kleinbuchstaben beginnen (z. B. int). Das sagt uns, dass es keine Klassen/Objekte sind. Was auch bedeutet, dass sie keine Methoden haben. Im Gegensatz dazu verhalten sich die Klassen (z. B. Integer) wie Kästen/Umhüllungen um diese Grundelemente, sodass sie wie Objekte verwendet werden können.

Strategie:

Um eine Double in eine Integer umzuwandeln, müsste man dieser Strategie folgen:

  1. Konvertieren Sie das Double-Objekt in ein primitives double. (= "Unboxing")
  2. Konvertieren Sie das Primitiv double in ein Primitiv int. (= "Casting")
  3. Konvertieren Sie das Grundelement int in ein Integer-Objekt. (= "Boxen")

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

Eigentlich gibt es eine Verknüpfung. Sie können den Posteingang sofort von einem Double direkt zu einem primitiven int aufheben. Auf diese Weise können Sie Schritt 2 vollständig überspringen.

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

Fallstricke:

Es gibt jedoch viele Dinge, die im obigen Code nicht behandelt werden .. _ Der obige Code ist nicht nullsicher.

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

Jetzt funktioniert es gut für die meisten Werte. Ganzzahlen haben jedoch einen sehr kleinen Bereich (Min/Max-Wert) im Vergleich zu Double. Darüber hinaus können Doubles auch "spezielle Werte" enthalten, also ganze Zahlen nicht:

  • 1/0 = + unendlich 
  • -1/0 = -unendlich
  • 0/0 = undefiniert (NaN)

Abhängig von der Anwendung möchten Sie möglicherweise einige Filter hinzufügen, um unangenehme Ausnahmen zu vermeiden.

Das nächste Manko ist die Rundungsstrategie. Standardmäßig wird Java immer abgerundet. Das Abrunden macht in allen Programmiersprachen Sinn. Grundsätzlich verwirft Java nur einige Bytes. In Finanzanwendungen möchten Sie sicherlich die halbe Aufrundung verwenden (z. B. round(0.5) = 1 und 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- (un) boxen

Sie könnten versucht sein, auto- (un) boxing zu verwenden, aber ich würde nicht. Wenn Sie jetzt schon festgefahren sind, werden die nächsten Beispiele auch nicht so offensichtlich sein. Wenn Sie das Innenleben des automatischen Boxens nicht verstehen, verwenden Sie es bitte nicht.

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)

Ich denke, das Folgende sollte keine Überraschung sein. Wenn ja, möchten Sie vielleicht einen Artikel über das Casting in Java lesen.

double val7 = (double) 10; // works
Double val8 = (Double) Integer.valueOf(10); // doesn't work
Integer val9 = (Integer) 9; // pure nonsense

Wert bevorzugen:

Seien Sie auch nicht in der Versuchung, den new Integer()-Konstruktor zu verwenden (wie andere Antworten vorschlagen). Die valueOf()-Methoden sind besser, weil sie Caching verwenden. Es ist eine gute Angewohnheit, diese Methoden zu verwenden, da sie von Zeit zu Zeit etwas Gedächtnis sparen werden.

long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = new Integer(rounded); // waste of memory
38
bvdb

Ich sehe drei Möglichkeiten. Die ersten beiden schneiden die Ziffern ab, die letzten runden auf die nächste Ganzzahl.

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

Der einfachste Weg ist die Verwendung von intValue(). Dies gibt jedoch nur den ganzzahligen Teil zurück. es rundet sich nicht. Wenn Sie die Ganzzahl am nächsten an den Wert Double legen möchten, müssen Sie Folgendes tun:

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

Und vergessen Sie nicht den Nullfall:

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

Math.round() behandelt seltsame Entenfälle wie Unendlich und NaN mit relativer Anmut.

21
Michael Scheper

So was: 

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

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

Mach es einfach so ...

Double d = 13.5578;
int i = d.intValue();
System.out.println(i);
6
Sunil Sharma
Double d = 100.00;
Integer i = d.intValue();

Man sollte auch hinzufügen, dass es mit Autoboxing funktioniert.

Ansonsten bekommt man ein int (primitiv) und kann von dort aus eine Integer erhalten:

Integer i = new Integer(d.intValue());
6
manocha_ak

Rufen Sie intValue() für Ihr Double-Objekt auf.

Probier diese

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

Sie können dies tun, indem Sie "Engering oder Explicit Type Conversion" verwenden. Ich hoffe, dass es funktionieren wird.

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

PS: Es wird 0 ausgegeben, da double alle Dezimalwerte und nichts auf der linken Seite hat. Im Falle von 0,58 wird es auf 0 eingegrenzt. Für andere wird es die Magie bewirken.

3
Sarthak Bhatia

Double und Integer sind Wrapper-Klassen für Java-Primitive für Double bzw. Int. Sie können zwischen diesen wechseln, aber Sie verlieren den Gleitpunkt. Das heißt, 5.4 zu einem int wird 5. Wenn Sie es zurückwerfen, wird es 5,0 sein.

2
OnResolve

Verwenden Sie die doubleNumber.intValue();-Methode.

0
PanTau

Verwenden Sie einfach die intValue-Methode von Double

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

Speichereffizient, da die bereits erstellte Instanz von Double gemeinsam genutzt wird.

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