393 votes

Comment convertir un float en int avec Java

J'ai utilisé la ligne suivante pour convertir un float en int, mais ce n'est pas aussi précis que je le voudrais :

 float a=8.61f;
 int b;

 b=(int)a;

Le résultat est : 8 (Il devrait être 9 )

Quand a = -7.65f le résultat est : -7 (Il devrait être -8 )

Quelle est la meilleure façon de procéder ?

17 votes

Je dois souligner que le simple typage tronque la valeur et n'effectue aucune opération d'arrondi/de nivellement sur la valeur.

748voto

Tom Woolfrey Points 2010

Utilisation de Math.round() arrondira le flottant au nombre entier le plus proche.

1 votes

Pourquoi le typecast est-il nécessaire après Math.round() ?

86 votes

Math.round() renvoie à int donc le typecasting utilisant (int) est redondant.

5 votes

Utiliser l'un ou l'autre... (int)foo est plus simple.

195voto

vaxquis Points 2122

En fait, il existe différentes façons de convertir un flottant en int, en fonction du résultat que vous souhaitez obtenir : (pour int i , float f )

  • round (le nombre entier le plus proche du flottant donné)

    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

    note : ce montant est, par contrat, égal à (int) Math.floor(f + 0.5f)

  • tronquer (c'est-à-dire supprimer tout ce qui se trouve après le point décimal)

    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 nombre entier toujours plus grand/petit qu'une valeur donnée) si il a une partie fractionnaire quelconque)

    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

Pour les arrondis positif vous pouvez aussi simplement utiliser (int)(f + 0.5) qui fonctionne exactement comme Math.Round dans ces cas (conformément au document).

Vous pouvez également utiliser Math.rint(f) pour faire le arrondi au nombre entier pair le plus proche Cette méthode peut être utile si vous vous attendez à traiter un grand nombre de flottants dont la partie fractionnaire est strictement égale à 0,5 (notez les éventuels problèmes d'arrondi de l'IEEE), et si vous souhaitez conserver la moyenne de l'ensemble ; vous introduirez cependant un autre biais, où les nombres pairs seront plus fréquents que les impairs.

Voir

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

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

pour plus d'informations et quelques exemples.

0 votes

Rint est l'arrondi du banquier ; il permet de réduire les erreurs qui peuvent apparaître si vous arrondissez systématiquement 0,5 vers le haut ou vers le bas.

0 votes

@prosfilaes J'ai modifié la formulation et ajouté un lien wiki à cette partie de la réponse.

16voto

Math.round(value) arrondir la valeur au nombre entier le plus proche.

Utilisez

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

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

7voto

venkat Points 103

Math.round renvoie également une valeur entière, vous n'avez donc pas besoin de faire un typage.

int b = Math.round(float a);

6voto

Utilisez Math.round(value) puis, après le type, le convertir en nombre entier.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X