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)
Beachten Sie, dass Math.floorsich 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) --> 1int 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) --> 1int 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.
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.
Antworten:
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.floor
abgesehen hat es ein anderes Verhalten als das Runden in Richtung negative Unendlichkeit (@Chris Wong)quelle
Math.floor
sich ein anderes Ergebnis für negative Zahlen als eine einfache Typumwandlung erzeugen.System.out.println((long)(9.9999e300));
BigDecimal
undRoundingMode
Klassen AnwendungenROUND_DOWN
für Rund zu-Null undROUND_FLOOR
für Rund towards- negative Unendlichkeit.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ückkehrt1
), addierendouble
Sie 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 = 1
undy = 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 = 1
undy = 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
double
beim(int)
Typecasting auf- oder abgerundet wird .(int)(a + 0.8);
zu typisieren. Dies wird nur
(int)a + 1
dann aufgerundet , wenn die Dezimalwerte größer oder gleich 0,2 sind. Das heißt, durch Hinzufügen von 0,8 zudouble
unmittelbar 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.quelle
System.out.println(""+ (int)(-0.8d + 0.5))
wie erwartet 0 statt -1 aus(int)99.99999
Es wird 99 sein. Das Wirken eines Double auf ein Int rundet nicht, es wird der Bruchteil verworfen.
quelle
wobei n ein Doppel ist. Dies wird anscheinend tatsächlich ein Double zurückgeben. Stellen Sie also sicher, dass Sie es nachher typisieren.
quelle
Das funktioniert gut
int i = (int) dbl;
quelle
new Double(99.9999).intValue()
quelle
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.
quelle
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
.quelle
Versuchen Sie es mit Math.floor.
quelle