Konvertieren von Double in Integer in Java

114

In Java möchte ich ein Double in eine Ganzzahl konvertieren. Ich weiß, wenn Sie dies tun:

double x = 1.5;
int y = (int)x;

Sie erhalten y = 1. Wenn du das tust:

int y = (int)Math.round(x);

Sie werden wahrscheinlich 2 erhalten. Ich frage mich jedoch: Da doppelte Darstellungen von ganzen Zahlen manchmal wie 1,9999999998 oder so aussehen, besteht die Möglichkeit, dass das Wirken eines über Math.round () erstellten Doppelten immer noch zu einer abgeschnittenen Zahl führt als die gerundete Zahl, nach der wir suchen (dh: 1 statt 2 im Code wie dargestellt)?

(und ja, ich meine es als solches: Gibt es einen Wert für x, bei dem y ein Ergebnis anzeigt, das eher eine abgeschnittene als eine gerundete Darstellung von x ist?)

Wenn ja: Gibt es eine bessere Möglichkeit, aus einem Double ein gerundetes Int zu machen, ohne das Risiko einer Kürzung einzugehen?


Etwas herausgefunden: Math.round (x) gibt ein langes, kein doppeltes zurück. Daher: Für Math.round () ist es unmöglich, eine Zahl zurückzugeben, die wie 3.9999998 aussieht. Daher muss int (Math.round ()) niemals etwas abschneiden und funktioniert immer.

vdMandele
quelle
6
Math.round (double) gibt ein Long zurück, kein Double.
Qbert220

Antworten:

95

Gibt es eine Möglichkeit, dass das Wirken eines über erstellten Doppels Math.round()immer noch zu einer abgeschnittenen Zahl führt?

Nein, round()wird Ihr Double immer auf den richtigen Wert runden und dann auf einen Wert umgewandelt, longder alle Dezimalstellen abschneidet. Nach dem Runden bleiben jedoch keine Bruchteile übrig.

Hier sind die Dokumente von Math.round(double):

Gibt die dem Argument am nächsten liegende Länge zurück. Das Ergebnis wird auf eine ganze Zahl gerundet, indem 1/2 addiert wird, der Boden des Ergebnisses genommen und das Ergebnis auf long getippt wird. Mit anderen Worten, das Ergebnis entspricht dem Wert des Ausdrucks:

(long)Math.floor(a + 0.5d)
jjnguy
quelle
3
Der wichtige Punkt ist, dass die Rundung innerhalb der Rundungsmethode erfolgt. Es wird ein langer Wert zurückgegeben, der sicher in einen int umgewandelt werden kann (vorausgesetzt, der zurückgegebene Wert liegt immer im int-Bereich).
Qbert220
Ja. Ich kann mir nicht vorstellen, ein / langes / int Probleme zu geben. Offensichtlich! Hätte das
herausfinden sollen
1
Es ist zwar richtig, dass aufgrund der Rundung keine Kürzung auftritt, aber Sie erhalten möglicherweise nicht die erwarteten Ergebnisse, nur weil das Casting von double, einer sehr großen Zahl, [max double: 1.7976931348623157E308]zu int, das viel viel kleiner ist [max int: 2147483647]. Nur etwas zu beachten.
Nelda.techspiress
22

Für den Datentyp Doubleto intkönnen Sie Folgendes verwenden:

Double double = 5.00;

int integer = double.intValue();
Charlie
quelle
Er sucht einen gerundeten Wert.
Marquis von Lorne
1
Ich denke nicht, dass das geben wird, was Sie für 4.99999999999 erwarten (wird 4 nicht 5 geben)
Murkle
10
Double perValue = 96.57;
int roundVal= (int) Math.round(perValue);

Hat meinen Zweck gelöst.

Nandkishor Gokhe
quelle