In Java Double in Integer umwandeln


348

Jede Art und Weise zu Guss java.lang.Doublezu java.lang.Integer?

Es wird eine Ausnahme ausgelöst

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

Antworten:


464

A Doubleist kein Integer, also wird die Besetzung nicht funktionieren. Beachten Sie den Unterschied zwischen der Double Klasse und dem double Grundelement . Beachten Sie auch, dass a a Doubleist Number, also die Methode intValue , mit der Sie den Wert als Grundelement abrufen können int.


2
Ok, nicht zu besetzen. Ich muss ein Integer-Objekt von Double erhalten, nicht von 13.22222, sondern von 13.
4lex1v

181
dann einfach anrufen intValue().
Hvgotcodes

6
Vergessen Sie nicht, mit Nullen umzugehen.
Pimlottc

13
Beachten Sie, dass dies lediglich den ganzzahligen Teil des Double zurückgibt. Für 13.666667 oder sogar 13.9 erhalten Sie 13, nicht 14. Wenn Sie die nächste Ganzzahl möchten , lesen Sie
Michael Scheper

2
Wenn Sie sich die Implementierung von ansehen intValue(), wird nur das doublezu einem int.
carlo.marinangeli

565

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

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

Oder

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

67
Vielen Dank. Sehr deutlich. Die akzeptierte Antwort fühlt sich für mich wie Schelten an, weil ich eine dumme Frage gestellt habe. Aber Ihre Antwort ist sehr großzügig.
Buddhika Ariyaratne

2
Was passiert, wenn der doppelte Wert außerhalb des ganzzahligen Bereichs liegt? (wie 2 ^ 33)
Nikdeapen

5
Jeder doppelte Wert> 2^31 - 1 (Integer.MAX_VALUE)läuft über.
Anubhava

3
Übrigens, wenn von double nach int umgewandelt wird, bleibt nur der ganzzahlige Teil für positive und negative Zahlen erhalten, und es ist egal, ob gerundet wird. zB 1.6 -> 1, 1.4 -> 1, -1.6 -> -1, -1.4 -> -1,
Eric Wang

51

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

Sie können Integerein DoubleObjekt nicht direkt umwandeln . Auch DoubleundInteger sind unveränderliche Objekte, so dass Sie sie in keiner Weise ändern können.

Jede numerische Klasse hat eine primitive Alternative ( Doublevs double, Integervs int, ...). Beachten Sie, dass diese Grundelemente mit einem Kleinbuchstaben beginnen (z int. B. ). Das sagt uns, dass sie keine Klassen / Objekte sind. Was auch bedeutet, dass sie keine Methoden haben. Im Gegensatz dazu sind die Klassen (zInteger verhalten sich ) wie Kästchen / Wrapper um diese Grundelemente, wodurch es möglich ist, sie wie Objekte zu verwenden.

Strategie:

Um a in a umzuwandeln Double, müssen IntegerSie folgende Strategie verfolgen:

  1. Konvertieren Sie das DoubleObjekt in ein Grundelementdouble . (= "Unboxing")
  2. Konvertieren Sie das Grundelement doublein ein Grundelementint . (= "Casting")
  3. Konvertieren Sie das Grundelement intzurück in ein IntegerObjekt. (= "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 Abkürzung. Sie können sofort von einem DoubleStraight zu einem Primitive entpacken int. 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

Tücken:

Es gibt jedoch viele Dinge, die im obigen Code nicht behandelt werden. Der obige Code ist nicht null-sicher.

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 für die meisten Werte einwandfrei. Ganzzahlen haben jedoch einen sehr kleinen Bereich (Min / Max-Wert) im Vergleich zu a Double. Darüber hinaus können Doubles auch "spezielle Werte" enthalten, die Ganzzahlen nicht können:

  • 1/0 = + unendlich
  • -1/0 = -infinity
  • 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 dann die Rundungsstrategie. Standardmäßig wird Java immer abgerundet. Abrunden ist in allen Programmiersprachen durchaus sinnvoll. Grundsätzlich wirft Java nur einige der Bytes weg. In Finanzanwendungen möchten Sie sicherlich eine halbe Rundung verwenden (z . B.: round(0.5) = 1Und 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-) Boxen zu verwenden, aber ich würde nicht. Wenn Sie jetzt schon feststecken, werden die nächsten Beispiele auch nicht so offensichtlich sein. Wenn Sie das Innenleben des Auto- (Un-) 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 dies jedoch der Fall ist, sollten Sie 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

Bevorzugen Sie valueOf:

Versuchen Sie auch nicht, einen new Integer()Konstruktor zu verwenden (wie einige andere Antworten vorschlagen). Die valueOf()Methoden sind besser, weil sie Caching verwenden. Es ist eine gute Angewohnheit, diese Methoden zu verwenden, da sie Ihnen von Zeit zu Zeit Speicherplatz sparen.

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

1
Dies ist meiner Meinung nach die beste Antwort
Thor

39

Ich sehe drei Möglichkeiten. Die ersten beiden schneiden die Ziffern ab, die letzte rundet 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

21
Integer.valueOf ist nicht erforderlich, wenn Sie das Ergebnis in einem primitieve int speichern möchten. Ihr Code zwingt Java, ein unnötiges Ein- und Auspacken durchzuführen.
bvdb


23

In der Tat ist der einfachste Weg zu verwenden intValue(). Dies gibt jedoch nur den ganzzahligen Teil zurück; es wird nicht gerundet. Wenn Sie möchten, dass die Ganzzahl dem Double-Wert am nächsten kommt , 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 Unendlichkeit und NaN mit relativer Anmut.


2
Warum benötigen Sie Integer.valueOf, wenn Sie das Ergebnis Math.round in int umwandeln?
Eran H.

@EranH.: Ab Java 1.5 ist dies wahrscheinlich nicht der Fall. Autoboxing bedeutet, dass der Code wahrscheinlich in beiden Fällen dasselbe tut. Aber ich denke, dieser Code ist klarer für Leute, die Objekte und Grundelemente noch nicht ganz verstanden haben.
Michael Scheper

Wer auch immer diese Antwort abgelehnt hat: Sie helfen der Community viel mehr, wenn Sie erklären, warum, und es kann Ihnen sogar helfen, herauszufinden, warum es bei Ihnen nicht funktioniert hat. Das Abstimmen ohne Erklärung, OTOH, ist für alle nicht hilfreich und wirkt feige.
Michael Scheper

14
double a = 13.34;
int b = (int) a;

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

2
Die Frage betraf speziell die Wrapper-Klassen. Diese Antwort handelt von Primitiven.
Michael Scheper

8

Mach es einfach so ...

Double d = 13.5578;
int i = d.intValue();
System.out.println(i);

7
Double d = 100.00;
Integer i = d.intValue();

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

Andernfalls erhalten Sie ein int (primitiv) und können dann eine Ganzzahl von dort erhalten:

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

2
Verwenden Sie nicht new Integer(int), sondern verwenden Sie Integer.valueOf(int)einen Cache für kleine Ganzzahlen wie diese.
Bvdb


4

Sie können dies tun, indem Sie "Enge oder explizite Typkonvertierung" verwenden, double → long → int. 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 gegeben, da double alle Dezimalwerte und nichts auf der linken Seite hat. Im Fall von 0,58 wird es auf 0 eingegrenzt, aber für andere wird es die Magie tun.


4

Probier diese

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

3

Double und Integer sind Wrapper-Klassen für Java-Grundelemente für double bzw. int. Sie können zwischen diesen wechseln, aber Sie verlieren den Gleitkomma. Das heißt, 5.4, das in ein int umgewandelt wird, ist 5. Wenn Sie es zurückwerfen, ist es 5.0.


0

Verwenden Sie einfach die intValue-Methode von Double

Double initialValue = 7.12;
int finalValue = initialValue.intValue();

2
Scheint eine Wiederholung der anderen Antworten zu sein.
Pang

0

Verwenden Sie die doubleNumber.intValue();Methode.


2
Scheint eine Wiederholung der anderen Antworten zu sein.
Pang

-1

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

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

Gibt es einen Grund für die Math.floor(...)? intValue()sowieso immer Böden.
Bvdb

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.