So konvertieren Sie float mit Java in int

342

Ich habe die folgende Zeile verwendet, um float in int umzuwandeln, aber es ist nicht so genau, wie ich es gerne hätte:

 float a=8.61f;
 int b;

 b=(int)a;

Das Ergebnis ist: 8(Es sollte sein 9)

Wann a = -7.65fist das Ergebnis: -7(Es sollte sein -8)

Was ist der beste Weg, um es zu tun?

Frank
quelle
16
Ich sollte darauf hinweisen, dass nur durch Typografie der Wert abgeschnitten wird und keine Rundungs- / Bodenoperationen für den Wert ausgeführt werden.
Brian Graham

Antworten:

678

Mit Math.round()wird der Gleitkommawert auf die nächste Ganzzahl gerundet.

tw39124
quelle
1
Warum wird der Typecast nach Math.round () benötigt?
Nekromant
81
Math.round()Gibt einen intWert zurück, sodass Typecasting mit (int)redundant ist.
Solvek
5
Verwenden Sie entweder / oder ... (int)fooist einfacher.
Yuttadhammo
31
Die Antwort von Solvek ist richtig, aber ich möchte darauf hinweisen, dass Math.round () basierend auf der Eingabe zwei verschiedene Ausgabetypen haben kann. Math.round (double a) gibt ein Long zurück. Math.round (float a) gibt ein int zurück. docs.oracle.com/javase/7/docs/api/java/lang/…
Hososugi
2
Math.round () ist eine langsame Operation im Vergleich zum Casting auf (int)
darkgaze
186

Tatsächlich gibt es verschiedene Möglichkeiten, float auf int herunterzuspielen, je nachdem, welches Ergebnis Sie erzielen möchten: (für int i, float f)

  • rund (die dem gegebenen Float am nächsten liegende Ganzzahl)

    i = Math.round(f);
      f =  2.0 -> i =  2 ; f =  2.22 -> i =  2 ; f =  2.68 -> i =  3
      f = -2.0 -> i = -2 ; f = -2.22 -> i = -2 ; f = -2.68 -> i = -3

    Hinweis: Dies ist vertraglich gleich (int) Math.floor(f + 0.5f)

  • abschneiden (dh alles nach dem Dezimalpunkt fallen lassen)

    i = (int) f;
      f =  2.0 -> i =  2 ; f =  2.22 -> i =  2 ; f =  2.68 -> i =  2
      f = -2.0 -> i = -2 ; f = -2.22 -> i = -2 ; f = -2.68 -> i = -2
  • Decke / Boden (eine ganze Zahl, die immer größer / kleiner als ein gegebener Wert ist, wenn sie einen Bruchteil hat)

    i = (int) Math.ceil(f);
      f =  2.0 -> i =  2 ; f =  2.22 -> i =  3 ; f =  2.68 -> i =  3
      f = -2.0 -> i = -2 ; f = -2.22 -> i = -2 ; f = -2.68 -> i = -2
    
    i = (int) Math.floor(f);
      f =  2.0 -> i =  2 ; f =  2.22 -> i =  2 ; f =  2.68 -> i =  2
      f = -2.0 -> i = -2 ; f = -2.22 -> i = -3 ; f = -2.68 -> i = -3

Zum Runden positiver Werte können Sie auch einfach verwenden (int)(f + 0.5), was genau wie Math.Roundin diesen Fällen funktioniert (gemäß Dokument).

Sie können auch Math.rint(f)die Rundung auf die nächste gerade ganze Zahl durchführen . Dies ist wahrscheinlich nützlich, wenn Sie damit rechnen, mit vielen Floats mit einem Bruchteil von genau 0,5 zu arbeiten (beachten Sie die möglichen IEEE-Rundungsprobleme) und den Durchschnitt des Satzes beibehalten möchten. Sie werden eine andere Tendenz einführen, bei der gerade Zahlen häufiger als ungerade sind.

Sehen

http://mindprod.com/jgloss/round.html

http://docs.oracle.com/javase/6/docs/api/java/lang/Math.html

Weitere Informationen und einige Beispiele.


quelle
Rint ist die Rundung des Bankiers; Es hilft dabei, Fehler zu reduzieren, die auftreten können, wenn Sie 0,5 gleichmäßig auf- oder abrunden.
Prosfilaes
@prosfilaes Ich habe den Wortlaut geändert und diesem Teil der Antwort einen Wiki-Link hinzugefügt.
15

Math.round(value) Runden Sie den Wert auf die nächste ganze Zahl.

Verwenden

1) b=(int)(Math.round(a));

2) a=Math.round(a);  
   b=(int)a;
SHUNMUGA RAJ PRABAKARAN
quelle
6

Math.round gibt auch einen ganzzahligen Wert zurück, sodass Sie keine Typumwandlung durchführen müssen.

int b = Math.round(float a);
venkat
quelle
13
Andere Antworten sagen dies bereits. Bitte fügen Sie nur dann eine neue Antwort hinzu, wenn Sie etwas Neues hinzufügen möchten. (Auch Math.round gibt nicht int zurück.)
Jeffrey Bosboom
1
Er erklärt, dass keine Notwendigkeit typisiert ist (auf Sachithras Antwort). Es kann aber als Kommentar konvertiert werden.
Ranjith Kumar
5

Verwenden Sie Math.round(value)dann nach dem Typ Cast es in Integer.

float a = 8.61f;
int b = (int)Math.round(a);
Sachithra Sewwandi
quelle
Math.round (float) gibt ein int zurück, ich bin nicht sicher, warum die Umwandlung in int notwendig ist
Nephilim
-1

Für mich einfacher: (int) (a +.5) // a ist ein Float. Gerundeten Wert zurückgeben.

Nicht abhängig von Java Math.round () -Typen

Bruno L.
quelle
4
Dies wird viele Entwickler verwirren, die den Code analysieren. Es wird nicht klar sein, dass es rundet.
ivan.panasiuk
1
Natürlich ist es, es ist nur grundlegende Mathematik, versuchen Sie es einfach
Bruno L.
4
"Grundlegende Mathematik" ist ein relativer Begriff. :) Nach meiner Erfahrung kann ich wetten, dass mehr als 50% der Entwickler nicht verstehen werden, dass es wirklich rund ist. Es ist mathematisch korrekt, aber wie ich geschrieben habe, ist es nicht klar und es ist für andere schwer zu verstehen, was der Code tut.
ivan.panasiuk
2
-(int) ( PI / 3 ): versuchen Sie Ihren Code mit einem Negativ a... seit wann -0.5rundet auf 0?
Sie haben Recht, wenn die Zahl negativ ist, müssen Sie stattdessen -0,5 hinzufügen
Bruno L.