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"

4lex1v
quelle

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.

hvgotcodes
quelle
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;
Anubhava
quelle
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
bvdb
quelle
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
squit
quelle
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

So was:

Double foo = 123.456;
Integer bar = foo.intValue();
Richard Schwartz
quelle
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.

Michael Scheper
quelle
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
Conflittimat
quelle
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);
Sunil Sharma
quelle
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());
manocha_ak
quelle
2
Verwenden Sie nicht new Integer(int), sondern verwenden Sie Integer.valueOf(int)einen Cache für kleine Ganzzahlen wie diese.
Bvdb
6

Rufen Sie intValue()Ihr DoubleObjekt an.

Alejandro Pablo Tkachuk
quelle
1
Scheint eine Wiederholung der früheren Antworten zu sein.
Pang
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.

Sarthak Bhatia
quelle
4

Probier diese

double doubleValue = 6.5;Double doubleObj = new Double(doubleValue);int intResult = doubleObj.intValue();
Samantha de Silva
quelle
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.

OnResolve
quelle
0

Verwenden Sie einfach die intValue-Methode von Double

Double initialValue = 7.12;
int finalValue = initialValue.intValue();
Ravi Ranjan
quelle
2
Scheint eine Wiederholung der anderen Antworten zu sein.
Pang
0

Verwenden Sie die doubleNumber.intValue();Methode.

PanTau
quelle
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()
Ravinder Payal
quelle
Gibt es einen Grund für die Math.floor(...)? intValue()sowieso immer Böden.
Bvdb
-2

Es hat bei mir funktioniert. Versuche dies:

double od = Double.parseDouble("1.15");
int oi = (int) od;
Andrey Lychok Lychov-Podvala
quelle