Wie kann man in Java ein Double in ein Int umwandeln, indem man es abrundet?

76

Ich muss in Java ein Double in ein Int umwandeln, aber der numerische Wert muss immer abgerundet werden. dh 99,99999999 -> 99

Badpanda
quelle
Mögliches Duplikat von Wie man Float mit Java in Int konvertiert
Ciro Santilli 法轮功 冠状 病 病 六四 26
Ich glaube, dass Floats und Doubles in Java unterschiedliche Datentypen sind.
Badpanda
Ich denke, sie sind zu nah, weil beide Primitive und Gleitkommatypen sind. Die Antworten sind die gleichen und werden es höchstwahrscheinlich auch weiterhin sein.
Ciro Santilli 27 冠状 病 六四 事件 27
1
Tatsächlich fragt die Gleitkomma-Frage genauer, wie ein Float gerundet werden soll (gemäß einem nicht spezifizierten Rundungsstandard). Diese Frage, die wahrscheinlich passender in "Wie kann man ein Double gegen Null runden und in Java in int umwandeln?" Umbenannt werden könnte. ähnelt der Frage, wie ein Doppelboden ausgelegt werden soll, mit der Ausnahme, dass der Bodenbelag eher auf eine negative Unendlichkeit als auf Null abrundet. Die Antworten sind sehr unterschiedlich, obwohl die Titel der Fragen ähnlich sind.
Badpanda

Antworten:

140

Beim Umwandeln in ein int wird implizit jede Dezimalstelle gelöscht. Sie müssen Math.floor () nicht aufrufen (unter der Annahme positiver Zahlen).

Einfach mit (int) typisieren, zB:

System.out.println((int)(99.9999)); // Prints 99

Davon Math.floorabgesehen hat es ein anderes Verhalten als das Runden in Richtung negative Unendlichkeit (@Chris Wong)

Xorlev
quelle
26
Beachten Sie, dass Math.floor sich ein anderes Ergebnis für negative Zahlen als eine einfache Typumwandlung erzeugen.
Joey
3
Es kommt darauf an, was das OP unter "Abrunden" versteht. Die Besetzung rundet es "nach unten" gegen Null, während Math.floor gegen negative Unendlichkeit rundet.
Lambda Fairy
5
Beachten Sie auch, dass ein int nicht alle möglichen ganzzahligen Werte darstellen kann, die ein Double kann. Wenn Sie einen Wert mit doppelter Genauigkeit abschneiden möchten, wandeln Sie ihn in einen 64-Bit-Ganzzahlwert wie long um. System.out.println((long)(9.9999e300));
Monroe Thomas
1
Obwohl IEEE 754 Rundungsregeln verwendet den Begriff Abschneiden für Rund in Richtung Null ist , und verwendet die synonyme Begriffe abrunden und Boden für Rund Richtung negativen-infinity, Java BigDecimalund RoundingModeKlassen Anwendungen ROUND_DOWNfür Rund zu-Null und ROUND_FLOORfür Rund towards- negative Unendlichkeit.
Andreas
32

Um ein Double in ein Int umzuwandeln und es auf die nächste Ganzzahl runden zu lassen (dh im Gegensatz zu dem typischen (int)(1.8)und (int)(1.2), das beide in Richtung 0 " abrundet " und zurückkehrt 1), addieren doubleSie einfach 0,5 zu dem Wert, den Sie in eine eingebenint .

Zum Beispiel, wenn wir haben

double a = 1.2;
double b = 1.8;

Dann die folgenden Typumwandlungsausdrücke für x und y und geben die abgerundeten Werte ( x = 1und y = 1) zurück:

int x = (int)(a);   // This equals (int)(1.2) --> 1
int y = (int)(b);   // This equals (int)(1.8) --> 1

Durch Addition von jeweils 0,5 erhalten wir jedoch das auf die nächste ganze Zahl gerundete Ergebnis , das wir in einigen Fällen ( x = 1und y = 2) wünschen können :

int x = (int)(a + 0.5);   // This equals (int)(1.8) --> 1
int y = (int)(b + 0.5);   // This equals (int)(2.3) --> 2

Als kleine Anmerkung können Sie mit dieser Methode auch den Schwellenwert steuern, bei dem das doublebeim (int)Typecasting auf- oder abgerundet wird .

(int)(a + 0.8);

zu typisieren. Dies wird nur (int)a + 1dann aufgerundet , wenn die Dezimalwerte größer oder gleich 0,2 sind. Das heißt, durch Hinzufügen von 0,8 zu doubleunmittelbar vor der Typisierung werden 10.15 und 10.03 beim (int)Typisieren auf 10 abgerundet , aber 10.23 und 10.7 werden auf 11 aufgerundet.

JavaDrip
quelle
6
Du hast vollkommen recht, das tut es nicht. Ich habe gesehen, dass dieser Thread auftaucht, wenn Google nach "Java int typecast double" sucht, und dachte, dass jemand, der nach einer Möglichkeit sucht, direkt mit dem (int) typecast auf- und abzurunden, dies verwenden könnte. Dies wird nicht über ein Stackoverflow-Konto veröffentlicht (ich versuche also nicht, meinen Ruf zu verbessern, wenn dies hier ernst genommen wird), sondern nur, einen coolen Trick zu verbreiten, den ich ziemlich oft verwende. :) Prost!
JavaDrip
4
Schön, aber denken Sie daran, dies funktioniert nur mit positiven Doppel. Wenn Sie beispielsweise mit diesem Trick -0,8 runden, gibt der Code System.out.println(""+ (int)(-0.8d + 0.5))wie erwartet 0 statt -1 aus
Gil Vegliach
17

(int)99.99999

Es wird 99 sein. Das Wirken eines Double auf ein Int rundet nicht, es wird der Bruchteil verworfen.

Leeeroy
quelle
11
Math.floor(n)

wobei n ein Doppel ist. Dies wird anscheinend tatsächlich ein Double zurückgeben. Stellen Sie also sicher, dass Sie es nachher typisieren.

Austin Fitzpatrick
quelle
2
Keine Notwendigkeit, vor dem Casting Fuß zu fassen, siehe Xorlevs Antwort.
Mizipzor
6
@miz: Die Semantik für negative Zahlen ist jedoch unterschiedlich.
Joey
5

Das funktioniert gut int i = (int) dbl;

fastcodejava
quelle
5

new Double(99.9999).intValue()

Nico.S
quelle
1

versuchen Sie es damit, das ist einfach

double x= 20.22889909008;
int a = (int) x;

this will return a=20

oder versuchen Sie es damit: -

Double x = 20.22889909008;
Integer a = x.intValue();

this will return a=20

oder versuchen Sie es damit: -

double x= 20.22889909008;
System.out.println("===="+(int)x);

this will return ===20

Möglicherweise hilft Ihnen dieser Code.

Amitsharma
quelle
1

In dieser Frage:

1.Casting Double to Integer ist eine sehr einfache Aufgabe.

2.Aber es wird kein doppelter Wert auf die nächste Dezimalstelle gerundet. Daher kann das Casting folgendermaßen durchgeführt werden:

double d=99.99999999;
int i=(int)d;
System.out.println(i);

und es wird gedruckt 99, aber es wurde nicht gerundet.

So können wir zum Runden verwenden,

double d=99.99999999;
System.out.println( Math.round(d));

Dadurch wird die Ausgabe von gedruckt 100.

R.Nish
quelle
0

Versuchen Sie es mit Math.floor.

John
quelle