2009-08-18 18 views
243

que utilizó la siguiente línea para convertir float a int, pero que no es tan preciso como me gustaría:Cómo convertir flotador a int en Java

float a=8.61f; 
int b; 

b=(int)a; 

El resultado es: 8 (Cabe 9)

Cuando a = -7.65f, el resultado es: -7 (Cabe -8)

Cuál es la mejor manera de hacerlo?

+12

Debo señalar que acaba de encasillamiento trunca el valor y no realiza ninguna operación de redondeo/revestimiento para el valor. –

Respuesta

532

El uso de Math.round() redondeará el flotador al número entero más cercano.

+1

¿por qué es necesario el tipo de transmisión después de Math.round()? – necromancer

+72

['Math.round()'] (http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Math.html#round (float)) devuelve el valor 'int' para el encasillado con '(int)' es redundante. – Solvek

+4

use cualquiera o ... '(int) foo' es más simple. – yuttadhammo

162

En realidad, hay diferentes maneras de abatido flotador para INT, en función del resultado que desea alcanzar: (por int i, flotar f)

  • redonda (el número entero más cercano al flotador dado)

    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: esto es, por contrato, igual a (int) Math.floor(f + 0.5f)

  • truncado (es decir dejar todo después del punto decimal)

    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/piso (un número entero siempre más grande/más pequeño que un valor dado si tiene cualquier parte fraccionaria)

    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 
    

Por redondeo valores positivos, también puede simplemente usar (int)(f + 0.5), que funciona exactamente como Math.Round en esos casos (según el documento).

En teoría se podría utilizar Math.rint(f) para hacer el redondeo, pero rint no redondea hasta 0,5, redondea hacia arriba o hacia abajo, lo que sea del número entero menor o mayor es par, por lo que es inútil en la mayoría de los casos.

Ver

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

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

para obtener más información y algunos ejemplos.

14

Math.round(value) redondee el valor al número entero más cercano.

Uso

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

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

Uso Math.round(value) continuación, después de tipo fundido a un entero.

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

Math.round también devuelve un valor entero, por lo que no necesita encasillar.

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

Otras respuestas ya dicen esto. Solo agregue una nueva respuesta cuando tenga algo nuevo para agregar. (Además, Math.round no devuelve int.) –

+1

Da una explicación acerca de la necesidad de ningún tipo de conversión (a la respuesta de Sachithra). Pero se puede convertir como comentario. –

0

En cuanto a mí, más fácil: (int) (a +.5) // a es un flotador. Devuelve el valor redondeado. tipos

no depende de Java Math.round()

+0

Esto confundirá a muchos desarrolladores que analizan el código. No estará claro si está redondeando. –

+1

Por supuesto que lo es, solo son matemáticas básicas, solo intente –

+0

"Matemáticas básicas" es un término relativo. :) Según mi experiencia, puedo apostar a que más del 50% de los desarrolladores no comprenderán que realmente se está redondeando. Es matemáticamente correcto, pero como escribí, no está claro y es difícil para los demás entender lo que hace el código. –