Jak przekonwertować float na int za pomocą Java

342

Użyłem następującego wiersza, aby przekonwertować zmiennoprzecinkowe na int, ale nie jest tak dokładne, jak bym chciał:

 float a=8.61f;
 int b;

 b=(int)a;

Wynik jest następujący: 8(Powinno być 9)

Kiedy a = -7.65fwynikiem jest: -7(Powinno być -8)

Jak najlepiej to zrobić?

Szczery
źródło
16
Powinienem zaznaczyć, że samo rzutowanie tekstu obcina wartość i nie wykonuje żadnych operacji zaokrąglania / podłogi na wartości.
Brian Graham

Odpowiedzi:

678

Użycie Math.round()spowoduje zaokrąglenie liczby zmiennoprzecinkowej do najbliższej liczby całkowitej.

tw39124
źródło
1
dlaczego typecast jest potrzebny po Math.round ()?
nekromanta,
81
Math.round()zwraca intwartość, więc użycie typecastingu (int)jest zbędne.
Rozwiąż
5
użyj albo / albo ... (int)foojest prostsze.
yuttadhammo
31
Odpowiedź Solvek jest słuszna, ale chciałbym zauważyć, że Math.round () może mieć dwa różne typy danych wyjściowych w zależności od danych wejściowych. Math.round (double a) zwraca długi. Math.round (float a) zwraca liczbę całkowitą. docs.oracle.com/javase/7/docs/api/java/lang/…
Hososugi
2
Math.round () jest powolną operacją w porównaniu do rzutowania na (int)
darkgaze
186

W rzeczywistości istnieją różne sposoby obniżenia liczby zmiennoprzecinkowej do liczby int, w zależności od wyniku, który chcesz osiągnąć: (dla int i, float f)

  • round (najbliższa liczba całkowita do podanej liczby zmiennoprzecinkowej)

    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

    Uwaga: w umowie jest to równe (int) Math.floor(f + 0.5f)

  • obcinaj (tzn. upuść wszystko po kropce dziesiętnej)

    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
  • sufit / podłoga (liczba całkowita zawsze większa / mniejsza niż podana wartość, jeśli ma jakąkolwiek część ułamkową)

    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

Aby zaokrąglić wartości dodatnie , możesz również użyć (int)(f + 0.5), który działa dokładnie tak, jak Math.Roundw tych przypadkach (zgodnie z dokumentem).

Możesz także użyć Math.rint(f)do zaokrąglenia do najbliższej parzystej liczby całkowitej ; jest to prawdopodobnie przydatne, jeśli spodziewasz się poradzić sobie z wieloma zmiennoprzecinkowymi z częścią ułamkową ściśle równą 0,5. (zwróć uwagę na możliwe problemy z zaokrąglaniem IEEE) i chcesz utrzymać średnią zbioru; wprowadzisz inne nastawienie, w którym liczby parzyste będą bardziej powszechne niż nieparzyste.

Widzieć

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

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

po więcej informacji i kilka przykładów.


źródło
rint jest zaokrągleniem bankiera; pomaga zmniejszyć liczbę błędów, które mogą się pojawić, jeśli konsekwentnie zaokrąglasz 0,5 w górę lub w dół.
prosfilaes
@prosfilaes Zmieniłem sformułowanie i dodałem link wiki do tej części odpowiedzi.
15

Math.round(value) zaokrąglić wartość do najbliższej liczby całkowitej.

Posługiwać się

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

2) a=Math.round(a);  
   b=(int)a;
SHUNMUGA RAJ PRABAKARAN
źródło
6

Math.round zwraca również wartość całkowitą, więc nie musisz zapisywać tekstu.

int b = Math.round(float a);
venkat
źródło
14
Inne odpowiedzi już to mówią. Dodaj nową odpowiedź tylko wtedy, gdy masz coś nowego do dodania. (Również Math.round nie zwraca int.)
Jeffrey Bosboom
1
Wyjaśnia, że ​​nie ma potrzeby typowania obrazu (do odpowiedzi Sachithry). Ale może być konwertowany jako komentarz.
Ranjith Kumar
5

Użyj Math.round(value)następnie po typ rzuć go na liczbę całkowitą.

float a = 8.61f;
int b = (int)Math.round(a);
Sachithra Sewwandi
źródło
Math.round (float) zwraca int, nie jestem pewien, dlaczego rzutowanie na int jest konieczne
Nephilim
-1

Jeśli chodzi o mnie, łatwiej: (int) (a +.5) // a to Float. Zwraca zaokrągloną wartość.

Nie zależy od typów Java Math.round ()

Bruno L.
źródło
4
To dezorientuje wielu programistów, którzy analizują kod. Nie będzie jasne, że się zaokrągla.
ivan.panasiuk
1
Oczywiście, że tak, to tylko podstawowa matematyka, po prostu spróbuj
Bruno L.
4
„Podstawowa matematyka” jest terminem względnym. :) Z mojego doświadczenia mogę się założyć, że ponad 50% programistów nie zrozumie, że to naprawdę zaokrągla. Jest to poprawne matematycznie, ale jak napisałem, nie jest jasne i innym trudno jest zrozumieć, co robi kod.
ivan.panasiuk
2
-(int) ( PI / 3 ): wypróbuj kod z ujemnym a... od kiedy -0.5zaokrągla się do 0?
masz rację, jeśli liczba jest ujemna, zamiast tego musisz dodać -0,5
Bruno L.