Cómo convertir float a int con Java


342

Utilicé la siguiente línea para convertir float a int, pero no es tan precisa como me gustaría:

 float a=8.61f;
 int b;

 b=(int)a;

El resultado es: 8(Debería ser 9)

Cuando a = -7.65f, el resultado es: -7(Debería ser -8)

Cuál es la mejor manera de hacerlo ?


16
Debo señalar que solo el encasillado trunca el valor y no realiza ninguna operación de redondeo / piso en el valor.
Brian Graham

Respuestas:


678

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


1
¿Por qué es necesaria la conversión de texto después de Math.round ()?
nigromante

81
Math.round()devuelve un intvalor, por lo que el uso de conversión de texto (int)es redundante
Solvek

55
usar cualquiera / o ... (int)fooes más simple.
yuttadhammo

31
La respuesta de Solvek es correcta, pero me gustaría señalar que Math.round () puede tener dos tipos de salida diferentes en función de la entrada. Math.round (doble a) devuelve un largo. Math.round (float a) devuelve un int. docs.oracle.com/javase/7/docs/api/java/lang/…
Hososugi

2
Math.round () es una operación lenta en comparación con la conversión a (int)
darkgaze el

186

En realidad, hay diferentes formas de bajar flotante a int, dependiendo del resultado que desee lograr: (para int i, float f)

  • round (el 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)

  • truncar (es decir, soltar 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 / floor (un número entero siempre más grande / más pequeño que un valor dado si tiene alguna parte fraccional)

    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

Para redondear valores positivos , también puede usar (int)(f + 0.5), que funciona exactamente como Math.Rounden esos casos (según el documento).

También puede usar Math.rint(f)para redondear al entero par más cercano ; podría decirse que es útil si espera lidiar con muchos flotadores con una parte fraccionaria estrictamente igual a .5 (tenga en cuenta los posibles problemas de redondeo de IEEE) y desea mantener el promedio del conjunto en su lugar; introducirás otro sesgo, donde los números pares serán más comunes que los impares.

Ver

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

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

para más información y algunos ejemplos.


rint es el redondeo del banquero; ayuda a reducir los errores que pueden aparecer si consistentemente redondea 0.5 arriba o abajo.
prosfilaes

@prosfilaes He cambiado la redacción y he agregado un enlace wiki a esa parte de la respuesta.

15

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

Utilizar

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

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

6

Math.round también devuelve un valor entero, por lo que no necesita escribir a máquina.

int b = Math.round(float a);

14
Otras respuestas ya dicen esto. Agregue solo una nueva respuesta cuando tenga algo nuevo que agregar. (Además, Math.round no devuelve int.)
Jeffrey Bosboom

1
Él dio una explicación acerca de que no hay necesidad de encasillar (a Sachithra responde). Pero se puede convertir como comentario.
Ranjith Kumar

5

Utilice Math.round(value)luego después de escribirlo en entero.

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

Math.round (float) devuelve un int, no estoy seguro de por qué es necesario el reparto a int
Nephilim

-1

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

No depende de los tipos Java Math.round ()


44
Esto confundirá a muchos desarrolladores que analizan el código. No estará claro que se está redondeando.
ivan.panasiuk

1
Por supuesto que sí, es solo matemática básica, solo inténtalo
Bruno L.

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

2
-(int) ( PI / 3 ): prueba tu código con un negativo a... ¿desde cuándo se -0.5redondea 0?

tienes razón si el número es negativo, debes agregar -0.5 en su lugar
Bruno L.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.