Jede Art und Weise zu Guss java.lang.Double
zu java.lang.Integer
?
Es wird eine Ausnahme ausgelöst
"java.lang.ClassCastException: java.lang.Double nicht kompatibel mit java.lang.Integer"
A Double
ist 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 Double
ist Number
, also die Methode intValue
, mit der Sie den Wert als Grundelement abrufen können int
.
intValue()
.intValue()
, wird nur dasdouble
zu einemint
.Sie müssen den int-Wert explizit mit der Methode intValue () wie folgt abrufen:
Oder
quelle
2^31 - 1 (Integer.MAX_VALUE)
läuft über.1.6 -> 1
,1.4 -> 1
,-1.6 -> -1
,-1.4 -> -1
,Ich denke, es ist unmöglich, die anderen Antworten zu verstehen, ohne die Fallstricke und Argumente zu behandeln .
Sie können
Integer
einDouble
Objekt nicht direkt umwandeln . AuchDouble
undInteger
sind unveränderliche Objekte, so dass Sie sie in keiner Weise ändern können.Jede numerische Klasse hat eine primitive Alternative (
Double
vsdouble
,Integer
vsint
, ...). Beachten Sie, dass diese Grundelemente mit einem Kleinbuchstaben beginnen (zint
. 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üssenInteger
Sie folgende Strategie verfolgen:Double
Objekt in ein Grundelementdouble
. (= "Unboxing")double
in ein Grundelementint
. (= "Casting")int
zurück in einInteger
Objekt. (= "Boxen")In Code:
Eigentlich gibt es eine Abkürzung. Sie können sofort von einem
Double
Straight zu einem Primitive entpackenint
. Auf diese Weise können Sie Schritt 2 vollständig überspringen.Tücken:
Es gibt jedoch viele Dinge, die im obigen Code nicht behandelt werden. Der obige Code ist nicht null-sicher.
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: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) = 1
Undround(0.4) = 0
).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.
Ich denke, das Folgende sollte keine Überraschung sein. Wenn dies jedoch der Fall ist, sollten Sie einen Artikel über das Casting in Java lesen.
Bevorzugen Sie valueOf:
Versuchen Sie auch nicht, einen
new Integer()
Konstruktor zu verwenden (wie einige andere Antworten vorschlagen). DievalueOf()
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.quelle
Ich sehe drei Möglichkeiten. Die ersten beiden schneiden die Ziffern ab, die letzte rundet auf die nächste Ganzzahl.
quelle
So was:
quelle
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:Und vergessen Sie nicht den Nullfall:
Math.round()
behandelt seltsame Entenfälle wie Unendlichkeit und NaN mit relativer Anmut.quelle
quelle
Mach es einfach so ...
quelle
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:
quelle
new Integer(int)
, sondern verwenden SieInteger.valueOf(int)
einen Cache für kleine Ganzzahlen wie diese.Rufen Sie
intValue()
IhrDouble
Objekt an.quelle
Sie können dies tun, indem Sie "Enge oder explizite Typkonvertierung" verwenden, double → long → int. Ich hoffe, dass es funktionieren wird.
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.
quelle
Probier diese
quelle
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.
quelle
Verwenden Sie einfach die intValue-Methode von Double
quelle
Verwenden Sie die
doubleNumber.intValue();
Methode.quelle
Speichereffizient, da die bereits erstellte Instanz von Double gemeinsam genutzt wird.
quelle
Math.floor(...)
?intValue()
sowieso immer Böden.Es hat bei mir funktioniert. Versuche dies:
quelle