Antworten:
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 das double
zu einem int
.
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;
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
ein Double
Objekt nicht direkt umwandeln . Auch Double
undInteger
sind unveränderliche Objekte, so dass Sie sie in keiner Weise ändern können.
Jede numerische Klasse hat eine primitive Alternative ( Double
vs double
, Integer
vs 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.
Um a in a umzuwandeln Double
, müssen Integer
Sie folgende Strategie verfolgen:
Double
Objekt in ein Grundelementdouble
. (= "Unboxing")double
in ein Grundelementint
. (= "Casting")int
zurück in ein Integer
Objekt. (= "Boxen")// 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 Double
Straight 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
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:
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
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);
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
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
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
So was:
Double foo = 123.456;
Integer bar = foo.intValue();
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.
double a = 13.34;
int b = (int) a;
System.out.println(b); //prints 13
Mach es einfach so ...
Double d = 13.5578;
int i = d.intValue();
System.out.println(i);
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());
new Integer(int)
, sondern verwenden Sie Integer.valueOf(int)
einen Cache für kleine Ganzzahlen wie diese.
Rufen Sie intValue()
Ihr Double
Objekt an.
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.
Probier diese
double doubleValue = 6.5;Double doubleObj = new Double(doubleValue);int intResult = doubleObj.intValue();
Verwenden Sie einfach die intValue-Methode von Double
Double initialValue = 7.12;
int finalValue = initialValue.intValue();
Speichereffizient, da die bereits erstellte Instanz von Double gemeinsam genutzt wird.
Double.valueOf(Math.floor(54644546464/60*60*24*365)).intValue()
Math.floor(...)
? intValue()
sowieso immer Böden.
Es hat bei mir funktioniert. Versuche dies:
double od = Double.parseDouble("1.15");
int oi = (int) od;