conversion double en entier en java

114

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

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

vous obtenez y = 1. Si tu fais ça:

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

Vous en obtiendrez probablement 2. Cependant, je me demande: puisque les doubles représentations d'entiers ressemblent parfois à 1,9999999998 ou quelque chose du genre, y a-t-il une possibilité que le casting d'un double créé via Math.round () aboutisse toujours à un nombre tronqué, plutôt que le nombre arrondi recherché (ie: 1 au lieu de 2 dans le code comme représenté)?

(et oui, je le pense en tant que tel: y a-t-il une valeur pour x, où y affichera un résultat qui est une représentation tronquée plutôt qu'une représentation arrondie de x?)

Si c'est le cas: existe-t-il une meilleure façon de transformer un double en un entier arrondi sans courir le risque de troncature?


Compris quelque chose: Math.round (x) renvoie un long, pas un double. Par conséquent: il est impossible pour Math.round () de renvoyer un nombre ressemblant à 3.9999998. Par conséquent, int (Math.round ()) n'aura jamais besoin de tronquer quoi que ce soit et fonctionnera toujours.

vdMandele
la source
6
Math.round (double) renvoie un long, pas un double.
qbert220

Réponses:

95

Y a-t-il une possibilité que le fait de lancer un double créé via Math.round()entraîne toujours un nombre tronqué vers le bas

Non, round()arrondira toujours votre double à la valeur correcte, puis il sera converti en un longqui tronquera toutes les décimales. Mais après arrondi, il ne restera plus aucune fraction.

Voici les documents de Math.round(double):

Renvoie le long le 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 convertissant le résultat en type long. En d'autres termes, le résultat est égal à la valeur de l'expression:

(long)Math.floor(a + 0.5d)
jjnguy
la source
3
Le point important est que l'arrondi est effectué selon la méthode d'arrondi. Une valeur longue est renvoyée, qui peut être transtypée en toute sécurité en un int (en supposant que la valeur retournée sera toujours comprise dans la plage int).
qbert220
Oui. Je ne peux pas imaginer qu'un / long / to int pose des problèmes. Évidemment! J'aurais dû
comprendre
1
S'il est vrai que la troncature ne se produira pas à cause de l'arrondi, il se peut que vous n'obteniez toujours pas les résultats escomptés simplement en raison de la conversion de double qui est un très grand nombre [max double: 1.7976931348623157E308]à int qui est beaucoup plus petit [max int: 2147483647]. Juste quelque chose à garder à l'esprit.
Nelda.techspiress
22

Pour le type Doublede données to int, vous pouvez utiliser les éléments suivants:

Double double = 5.00;

int integer = double.intValue();
Charlie
la source
Il recherche une valeur arrondie.
Marquis of Lorne
1
Je ne pense pas que cela donnera ce que vous attendez pour 4.99999999999 (donnera 4 pas 5)
murkle
10
Double perValue = 96.57;
int roundVal= (int) Math.round(perValue);

J'ai résolu mon objectif.

Nandkishor Gokhe
la source