Como converter float para int com Java


342

Usei a seguinte linha para converter float em int, mas não é tão preciso quanto eu gostaria:

 float a=8.61f;
 int b;

 b=(int)a;

O resultado é: 8(deve ser 9)

Quando a = -7.65f, o resultado é: -7(Deve ser -8)

Qual é a melhor maneira de fazer isso?


16
Devo salientar que apenas a conversão de texto trunca o valor e não executa nenhuma operação de arredondamento / piso no valor.
22812 Brian Graham

Respostas:


678

Usar Math.round()arredondará o flutuador para o número inteiro mais próximo.


11
por que o typecast é necessário após Math.round ()?
Necromancer

81
Math.round()retorna intvalor para que a conversão de tipo usando (int)seja redundante.
Resolva

5
use um / ou ... (int)fooé mais simples.
Yuttadhammo 12/07/2012

31
A resposta de Solvek está certa, mas eu gostaria de salientar que Math.round () pode ter dois tipos de saída diferentes com base na entrada. Math.round (duplo a) retorna um longo. Math.round (float a) retorna um int. docs.oracle.com/javase/7/docs/api/java/lang/…
Hososugi 13/14

2
Math.round () é uma operação lenta em comparação com a carcaça (int)
darkgaze

186

Na verdade, existem diferentes maneiras de fazer o downcast de float para int, dependendo do resultado que você deseja alcançar: (para int i, float f)

  • round (o número inteiro mais próximo do dado 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: isto é, por contrato, igual a (int) Math.floor(f + 0.5f)

  • truncar (ou seja, largar tudo após o ponto 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
  • teto / piso (um número inteiro sempre maior / menor que um determinado valor, se tiver alguma parte fracionária)

    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 arredondar valores positivos , você também pode usar (int)(f + 0.5), o que funciona exatamente como Math.Roundnesses casos (conforme o documento).

Você também pode usar Math.rint(f)o arredondamento para o número par mais próximo ; é indiscutivelmente útil se você espera lidar com muitos carros alegóricos com partes fracionárias estritamente iguais a 0,5 (observe os possíveis problemas de arredondamento do IEEE) e deseja manter a média do conjunto no lugar; você introduzirá outro viés, no qual números pares serão mais comuns do que ímpares.

Vejo

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

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

para mais informações e alguns exemplos.


rint é o arredondamento dos banqueiros; ajuda a reduzir os erros que podem aparecer se você arredondar 0,5 para cima ou para baixo consistentemente.
prosfilaes 6/10/19

@prosfilaes Alterei a redação e adicionei um link wiki para essa parte da resposta.

15

Math.round(value) arredonde o valor para o número inteiro mais próximo.

Usar

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

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

6

Math.round também retorna um valor inteiro, assim você não precisa digitar.

int b = Math.round(float a);

14
Outras respostas já dizem isso. Adicione uma nova resposta apenas quando tiver algo novo a adicionar. (Além disso, Math.round não retorna int.)
Jeffrey Bosboom

11
Ele deu uma explicação sobre a falta de necessidade de digitação (para a resposta de Sachithra). Mas pode ser convertido como comentário.
precisa

5

Use Math.round(value)depois que o tipo converter para inteiro.

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

Math.round (float) retorna um inteiro, eu não sei por que o elenco para int é necessário
Nephilim

-1

Quanto a mim, mais fácil: (int) (a +.5) // a é um flutuador. Retornar valor arredondado.

Não depende dos tipos Java Math.round ()


4
Isso vai confundir muitos desenvolvedores que analisam o código. Não ficará claro se está arredondando.
Ivan.panasiuk

11
Claro que é, que é a matemática apenas básicos, apenas tentar
de Bruno L.

4
"Matemática básica" é um termo relativo. :) Pela minha experiência, posso apostar que mais de 50% dos desenvolvedores não entenderão que isso é realmente arredondado. É matematicamente correto, mas, como escrevi, não está claro e é difícil para os outros entenderem o que o código faz.
Ivan.panasiuk

2
-(int) ( PI / 3 ): tente seu código com um negativo a... desde quando -0.5arredonda para 0?

você está certo, se o número for negativo você deve adicionar -0.5 vez
de Bruno L.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.