77 votes

Comment convertir un double en un int en Java en l'arrondissant à l'inférieur ?

J'ai besoin de convertir un double en un int en Java, mais la valeur numérique doit toujours être arrondie vers le bas, c'est-à-dire 99,99999999 -> 99.

0 votes

0 votes

Je crois que les flottants et les doubles sont des types de données différents en Java.

0 votes

Je pense qu'ils sont trop proches car les deux sont des primitives et des types à virgule flottante. Les réponses sont les mêmes et vont très probablement continuer à l'être.

142voto

Xorlev Points 4658

Le transfert vers un int supprime implicitement toute décimale. Il n'est pas nécessaire d'appeler Math.floor() (en supposant des nombres positifs).

Il suffit de faire un typage avec (int), par exemple :

System.out.println((int)(99.9999)); // Prints 99

Ceci étant dit, il a un comportement différent de celui de l'outil Math.floor qui s'arrondit vers l'infini négatif (@Chris Wong)

28 votes

Notez que Math.floor fait produisent un résultat différent pour les nombres négatifs qu'un simple typage.

3 votes

Cela dépend de ce que l'OP entend par "arrondir vers le bas". La fonte arrondit "vers le bas" vers zéro, tandis que Math.floor arrondit vers l'infini négatif.

5 votes

Notez également qu'un int ne peut pas représenter toutes les valeurs entières possibles qu'un double peut représenter. Si vous souhaitez tronquer une valeur en double précision, il faut la convertir en une valeur entière de 64 bits comme long. System.out.println((long)(9.9999e300));

32voto

JavaDrip Points 161

Pour convertir un double en un int et l'arrondir à l'entier le plus proche (c'est-à-dire que, contrairement à la (int)(1.8) y (int)(1.2) qui va à la fois "arrondir" vers le bas vers 0 et retourner 1 ), il suffit d'ajouter 0,5 à la double que vous serez catalogué dans un int .

Par exemple, si nous avons

double a = 1.2;
double b = 1.8;

Ensuite, les expressions de typage suivantes pour x et y et renverront les valeurs arrondies ( x = 1 y y = 1 ):

int x = (int)(a);   // This equals (int)(1.2) --> 1
int y = (int)(b);   // This equals (int)(1.8) --> 1

Mais en ajoutant 0,5 à chacun d'entre eux, nous obtiendrons le résultat arrondi à un nombre entier que nous pouvons souhaiter dans certains cas ( x = 1 y y = 2 ):

int x = (int)(a + 0.5);   // This equals (int)(1.8) --> 1
int y = (int)(b + 0.5);   // This equals (int)(2.3) --> 2

Une petite note cette méthode vous permet également de contrôler le seuil à laquelle le double est arrondi vers le haut ou vers le bas sur (int) le typage.

(int)(a + 0.8);

pour faire du tapering. Cela ne fera qu'arrondir à (int)a + 1 chaque fois que les valeurs décimales sont supérieures ou égales à 0,2. C'est-à-dire qu'en ajoutant 0,8 aux double immédiatement avant la coulée, 10.15 et 10.03 seront arrondis à 10 au-dessous. (int) mais 10.23 et 10.7 seront arrondis à 11.

6 votes

Vous avez tout à fait raison, ce n'est pas le cas. J'ai vu que ce fil de discussion apparaît quand on cherche sur Google "Java int typecast double", et j'ai pensé que quelqu'un qui cherche un moyen d'arrondir directement avec le typecast (int) pourrait utiliser ceci. Ceci n'est pas posté en utilisant un compte stackoverflow (donc je n'essaye pas de booster ma réputation, si cela est pris au sérieux ici), j'essaye juste d'aider à diffuser une astuce sympa que j'utilise assez souvent :) A la vôtre !

4 votes

Sympa, mais n'oubliez pas que cela ne fonctionne qu'avec positif doubles. Par exemple, si vous arrondissez -0,8 avec cette astuce, alors le code System.out.println(""+ (int)(-0.8d + 0.5)) imprime 0, au lieu de -1 comme prévu

17voto

leeeroy Points 3664

(int)99.99999

La valeur sera 99. La transformation d'un double en un int n'arrondit pas les valeurs, elle élimine la partie fractionnée.

11voto

Austin Fitzpatrick Points 2589
Math.floor(n)

où n est un double. Cela retournera en fait un double, il semble, donc assurez-vous que vous le tapez après.

2 votes

Pas besoin de plancher avant le lancer, voir la réponse de Xorlev.

6 votes

@miz : La sémantique est différente pour les nombres négatifs, cependant.

5voto

fastcodejava Points 22174

Cela fonctionne bien int i = (int) dbl;

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