Come convertire float in int con Java


342

Ho usato la seguente riga per convertire float in int, ma non è accurato come vorrei:

 float a=8.61f;
 int b;

 b=(int)a;

Il risultato è: 8(Dovrebbe essere 9)

Quando a = -7.65f, il risultato è: -7(Dovrebbe essere -8)

Qual è il modo migliore per farlo?


16
Devo sottolineare che solo la tipografia tronca il valore e non esegue alcuna operazione di arrotondamento / pavimentazione sul valore.
Brian Graham,

Risposte:


678

L'uso Math.round()arrotonderà il float all'intero più vicino.


1
perché il typecast è necessario dopo Math.round ()?
Negromante

81
Math.round()restituisce intvalore in modo che la tipografia usando (int)sia ridondante.
Solvek,

5
usare / o ... (int)fooè più semplice.
Yuttadhammo,

31
La risposta di Solvek è corretta, ma vorrei sottolineare che Math.round () può avere due diversi tipi di output in base all'input. Math.round (double a) restituisce un valore long. Math.round (float a) restituisce un int. docs.oracle.com/javase/7/docs/api/java/lang/…
Hososugi

2
Math.round () è un'operazione lenta rispetto al casting di (int)
darkgaze

186

In realtà, ci sono diversi modi per eseguire il downcast del float su int, a seconda del risultato che si desidera ottenere: (per int i, float f)

  • round (il numero intero più vicino al dato float)

    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

    nota: questo è, per contratto, uguale a (int) Math.floor(f + 0.5f)

  • troncare (ovvero rilasciare tutto dopo il punto decimale)

    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
  • ceil / floor (un numero intero sempre più grande / più piccolo di un dato valore se ha una parte frazionaria)

    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

Per arrotondare valori positivi , puoi anche semplicemente usare (int)(f + 0.5), che funziona esattamente come Math.Roundin quei casi (come da documento).

Puoi anche usare Math.rint(f)per fare l' arrotondamento al numero intero pari più vicino ; è discutibilmente utile se ti aspetti di gestire molti float con una parte frazionaria strettamente uguale a 0,5 (nota i possibili problemi di arrotondamento IEEE) e vuoi mantenere la media del set; introducerai un altro pregiudizio, in cui i numeri pari saranno più comuni che dispari, però.

Vedere

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

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

per ulteriori informazioni e alcuni esempi.


rint è l'arrotondamento del banchiere; aiuta a ridurre gli errori che possono apparire se si arrotonda costantemente 0,5 su o giù.
prosfilaes,

@prosfilaes Ho modificato il testo e ho aggiunto un link wiki a quella parte della risposta.

15

Math.round(value) arrotondare il valore al numero intero più vicino.

Uso

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

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

6

Math.round restituisce anche un valore intero, quindi non è necessario digitare tipicamente.

int b = Math.round(float a);

14
Altre risposte lo dicono già. Aggiungi una nuova risposta solo quando hai qualcosa di nuovo da aggiungere. (Inoltre, Math.round non restituisce int.)
Jeffrey Bosboom il

1
Dà spiegazioni sul fatto che non è necessario il typecast (alla risposta di Sachithra). Ma può essere convertito come commento.
Ranjith Kumar,

5

Utilizzare Math.round(value)quindi dopo il tipo cast di integer.

float a = 8.61f;
int b = (int)Math.round(a);

Math.round (float) restituisce un int, non sono sicuro del motivo per cui il cast di int è necessario
Nephilim

-1

Quanto a me, più facile: (int) (a +.5) // a è un float. Restituisce un valore arrotondato.

Non dipende dai tipi di Java Math.round ()


4
Questo confonderà molti sviluppatori che analizzano il codice. Non sarà chiaro che sta arrotondando.
ivan.panasiuk,

1
Certo che lo è, è solo matematica di base, basta provare
Bruno L.

4
"Matematica di base" è un termine relativo. :) Per esperienza, posso scommettere che oltre il 50% degli sviluppatori non capirà che si tratta davvero di un arrotondamento. È matematicamente corretto, ma come ho scritto, non è chiaro ed è difficile per gli altri capire cosa fa il codice.
ivan.panasiuk,

2
-(int) ( PI / 3 ): prova il tuo codice con un negativo a... da quando si -0.5arriva a 0?

hai ragione se il numero è negativo devi invece aggiungere -0.5
Bruno L.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.