2009-08-18 21 views
243

ho usato la seguente riga per convertire float a int, ma non è così preciso come vorrei:Come convertire float a int con Java

float a=8.61f; 
int b; 

b=(int)a; 

Il risultato è: 8 (dovrebbe essere 9)

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

Qual è il modo migliore per farlo?

+12

Tengo a precisare che proprio typecasting tronca il valore e non esegue alcuna operazione di arrotondamento/pavimentazione sul valore. –

risposta

532

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

+1

perché il typecast è necessario dopo Math.round()? – necromancer

+72

['Math.round()'] (http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Math.html#round (float)) restituisce il valore 'int' così typecasting usando '(int)' è ridondante. – Solvek

+4

usa/o ... '(int) foo' è più semplice. – yuttadhammo

162

In realtà, ci sono diversi modi per Downcast float a int, a seconda del risultato che si desidera raggiungere: (per int i, float f)

  • round (il numero intero più vicino alla data 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, pari a (int) Math.floor(f + 0.5f)

  • troncato (es. tutto goccia 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/piano (un numero intero sempre maggiore/minore di un dato valore se ha alcuna 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 arrotondamento valori positivi, è anche possibile utilizzare semplicemente (int)(f + 0.5), che funziona esattamente come Math.Round in questi casi (come da documento).

In teoria si potrebbe usare Math.rint(f) per fare l'arrotondamento, ma rint non arrotonda 0.5 in su, arrotonda verso l'alto o verso il basso, a seconda di quale di numero intero inferiore o superiore è pari, quindi è inutile nella maggior parte dei casi.

Vedi

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

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

per ulteriori informazioni e alcuni esempi.

14

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

Uso Math.round(value) poi dopo tipo gettarlo a intero.

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

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

int b = Math.round(float a); 
+11

Altre risposte lo dicono già. Per favore aggiungi una nuova risposta solo quando hai qualcosa di nuovo da aggiungere. (Inoltre, Math.round non restituisce int.) –

+1

Fornisce spiegazioni su non c'è bisogno di typecast (per rispondere a Sachithra). Ma può essere convertito come commento. –

0

Quanto a me, più facile: (int) (un +.5) // a è un galleggiante. Ritorna il valore arrotondato.() Tipi

non dipende da Java Math.round

+0

Questo confonderà molti sviluppatori che analizzano il codice. Non sarà chiaro che sta arrotondando. –

+1

Certo che lo è, è solo una matematica di base, prova solo –

+0

"La matematica di base" è un termine relativo. :) Secondo la mia esperienza, posso scommettere che oltre il 50% degli sviluppatori non capirà che è davvero un round. È matematicamente corretto, ma come ho scritto, non è chiaro ed è difficile per gli altri capire cosa fa il codice. –