123 votes

Conversion d'un double en entier en Java

En Java, je veux convertir un double en un entier, je sais si vous faites cela :

double x = 1.5;
int y = (int)x;

on obtient y=1. Si vous faites cela :

int y = (int)Math.round(x);

Vous en obtiendrez probablement 2. Cependant, je me pose la question suivante : étant donné que les représentations doubles des entiers ressemblent parfois à 1,9999999998 ou quelque chose du genre, est-il possible que le fait de mouler un double créé via Math.round() aboutisse toujours à un nombre tronqué, plutôt qu'au nombre arrondi que nous recherchons (c'est-à-dire : 1 au lieu de 2 dans le code tel qu'il est représenté) ?

(et oui, je l'entends comme tel : Y a-t-il cualquier pour x, où y affichera un résultat qui est une représentation tronquée plutôt qu'arrondie de x ?)

Si oui : existe-t-il un meilleur moyen de transformer un double en un int arrondi sans courir le risque d'une troncature ?


J'ai trouvé quelque chose : Math.round(x) renvoie un long, pas un double. Il est donc impossible que Math.round() renvoie un nombre ressemblant à 3,9999998. Par conséquent, int(Math.round()) n'aura jamais besoin de tronquer quoi que ce soit et fonctionnera toujours.

7 votes

Math.round(double) renvoie un long, pas un double.

103voto

jjnguy Points 62123

Est-il possible de lancer un double créé par l'intermédiaire de Math.round() se traduira toujours par un nombre tronqué vers le bas

Non, round() arrondira toujours votre double à la bonne valeur, puis il sera transformé en une valeur de long qui tronquera toutes les décimales. Mais après l'arrondi, il ne restera plus de parties fractionnaires.

Voici les documents de Math.round(double) :

Renvoie la longueur la plus proche de l'argument. Le résultat est arrondi à un entier en ajoutant 1/2, en prenant le plancher du résultat et en coulant le résultat dans le type long. En d'autres termes, le résultat est égal à la valeur de l'expression :

(long)Math.floor(a + 0.5d)

3 votes

Le point important est que l'arrondi est effectué dans le cadre de la méthode round. Une valeur longue est renvoyée, qui peut être transformée en toute sécurité en un int (en supposant que la valeur renvoyée sera toujours comprise dans l'intervalle int).

0 votes

Oui. Je n'imagine pas qu'un /long/ à int puisse poser des problèmes. Évidemment ! J'aurais dû m'en rendre compte :(

1 votes

S'il est vrai que la troncature ne se produira pas en raison de l'arrondi, il se peut néanmoins que vous n'obteniez pas les résultats escomptés, simplement en raison du moulage à partir d'un double, qui est un très grand nombre. [max double: 1.7976931348623157E308] à int qui est beaucoup plus petit [max int: 2147483647] . C'est juste une chose à garder à l'esprit.

42voto

Charlie Points 1286

Pour le type de données Double à int vous pouvez utiliser ce qui suit :

Double double = 5.00;

int integer = double.intValue();

22voto

Nandkishor Gokhe Points 192
Double perValue = 96.57;
int roundVal= (int) Math.round(perValue);

J'ai résolu mon problème.

-9voto

gökhan Points 7
double a = 1.450;

String sa = String.valueOf(a);
int lengthUntilPoint = sa.indexOf(".")+1;
int power = sa.length() - lengthUntilPoint;
int ia = (int) (a* Math.pow(10, power));

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