Comment convertir float en int avec Java

342

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

 float a=8.61f;
 int b;

 b=(int)a;

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

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

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

Franc
la source
16
Je dois souligner que le simple transtypage tronque la valeur et n'effectue aucune opération d'arrondi / revêtement de sol sur la valeur.
Brian Graham

Réponses:

678

L'utilisation Math.round()arrondira le flottant à l'entier le plus proche.

tw39124
la source
1
pourquoi le transtypage est-il nécessaire après Math.round ()?
nécromancien
81
Math.round()renvoie une intvaleur, donc le transtypage en utilisant (int)est redondant.
Solvek
5
utiliser soit / ou ... (int)fooest plus simple.
yuttadhammo
31
La réponse de Solvek est juste, mais je voudrais souligner que Math.round () peut avoir deux types de sortie différents en fonction de l'entrée. Math.round (double a) renvoie un long. Math.round (float a) renvoie un int. docs.oracle.com/javase/7/docs/api/java/lang/…
Hososugi
2
Math.round () est une opération lente par rapport à la
conversion
186

En fait, il existe différentes façons de downcast float to int, selon le résultat que vous souhaitez obtenir: (pour int i, float f)

  • round (l'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: c'est, par contrat, égal à (int) Math.floor(f + 0.5f)

  • tronquer (c'est-à-dire supprimer tout 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
  • plafond / plancher (un entier toujours plus grand / plus petit qu'une valeur donnée s'il a une partie fractionnaire)

    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 arrondir les valeurs positives , vous pouvez également simplement utiliser (int)(f + 0.5), qui fonctionne exactement comme Math.Rounddans ces cas (selon la doc).

Vous pouvez également utiliser Math.rint(f)pour effectuer l' arrondi à l'entier pair le plus proche ; il est sans doute utile si vous prévoyez de traiter un grand nombre de flotteurs avec une partie fractionnaire strictement égale à 0,5 (notez les éventuels problèmes d'arrondi IEEE) et que vous souhaitez conserver la moyenne de l'ensemble en place; vous introduirez un autre biais, où les nombres pairs seront plus courants que les nombres impairs, cependant.

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.


la source
la monnaie est l'arrondi du banquier; il permet de réduire les erreurs qui peuvent apparaître si vous arrondissez ou augmentez régulièrement 0,5.
prosfilaes
@prosfilaes J'ai changé la formulation et ajouté un lien wiki vers cette partie de la réponse.
15

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

Utilisation

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

2) a=Math.round(a);  
   b=(int)a;
SHUNMUGA RAJ PRABAKARAN
la source
6

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

int b = Math.round(float a);
venkat
la source
14
D'autres réponses le disent déjà. Veuillez ajouter une nouvelle réponse uniquement lorsque vous avez quelque chose de nouveau à ajouter. (Aussi, Math.round ne retourne pas int.)
Jeffrey Bosboom
1
Il donne des explications sur la nécessité de ne pas transcrire le texte (à la réponse de Sachithra). Mais il peut être converti en commentaire.
Ranjith Kumar
5

Utilisez Math.round(value)ensuite après le type, transformez-le en entier.

float a = 8.61f;
int b = (int)Math.round(a);
Sachithra Sewwandi
la source
Math.round (float) renvoie un int, je ne sais pas pourquoi le transtypage en int est nécessaire
Nephilim
-1

Quant à moi, plus facile: (int) (a +.5) // a est un flotteur. Renvoie la valeur arrondie.

Ne dépend pas des types Java Math.round ()

Bruno L.
la source
4
Cela déroutera beaucoup de développeurs qui analysent le code. Il ne sera pas clair qu'il arrondit.
ivan.panasiuk
1
Bien sûr, ce ne sont que des mathématiques de base, essayez simplement
Bruno L.
4
"Mathématiques de base" est un terme relatif. :) D'après mon expérience, je peux parier que plus de 50% des développeurs ne comprendront pas qu'il s'agit vraiment d'un arrondi. C'est mathématiquement correct, mais comme je l'ai écrit, ce n'est pas clair et il est difficile pour les autres de comprendre ce que fait le code.
ivan.panasiuk
2
-(int) ( PI / 3 ): essayez votre code avec un négatif a... depuis quand -0.5arrondit à 0?
vous avez raison si le nombre est négatif, vous devez ajouter -0,5 à la place
Bruno L.