Vous devriez vraiment élaborer plus en détail «ne fonctionne pas». Ce qui se produit? Qu'est-ce qui ne se passe pas? Qu'est-ce que vous attendiez? Quelles erreurs avez-vous? Avez-vous une round()méthode dans la même classe? Avez-vous import static java.lang.Math.*? Etc .. Il y a beaucoup de manières d'arrondir les nombres et donc aussi beaucoup de réponses possibles. En d'autres termes, votre question est vague et ambiguë et ne peut pas être raisonnablement répondu dans sa forme actuelle. Il tourne dans le noir.
BalusC
1
Est-ce que "ne fonctionne pas" signifie ne pas arrondir à l'entier le plus proche, ou lancer une exception, ou ne pas arrondir vers le haut / bas? Cette question est inutile sans avoir à croiser le contexte avec la réponse.
modulitos du
Réponses:
239
Quel est le type de retour de la round()méthode dans l'extrait de code?
Si c'est la Math.round()méthode, elle renvoie un Long lorsque le paramètre d'entrée est Double.
Pensez à utiliser Math.toIntExact (long) au lieu de simplement convertir en un entier; un double peut contenir toute une gamme de valeurs et vous ne voudrez probablement pas jeter silencieusement les bits les plus significatifs si votre double est plus grand que prévu.
othp
Je pense que le casting n'est pas nécessaire. Je ne sais pas si c'était dans le passé, mais round renvoie int.
Abandon
@Dropout Math.round renvoie un int si vous lui donnez un flottant, et un long si vous lui donnez un double.
Tur1ng
27
Si vous n'aimez pas Math.round (), vous pouvez également utiliser cette approche simple:
Cette solution est plus courte, ne nécessite pas d'importation et est portable dans de nombreux autres langages de programmation avec des modifications minimes. Et cela pourrait même être plus rapide en fonction de votre plateforme: stackoverflow.com/questions/12091014/…
Dr. Daniel Thommes
1
Je ne critique pas votre réponse, que je trouve très utile pour la raison que vous évoquez. J'étais, par ce commentaire, m'adressant à des gens qui auraient peur d'utiliser Math.round(), ce qui fait «littéralement» la même chose que la solution que vous proposez, c'est tout. À votre santé.
Gauthier Boaglio
2
Oui, comme nehz l'a dit, je pense que cela arrondirait -2,1 à -1, par exemple.
Ben Aaronson
5
@AlbertoHormazabal, n'avez-vous pas remarqué qu'il a ajouté 0.5?
Sasha
11
Arrondir le double à l' entier "le plus proche" comme ceci:
1,4 -> 1
1,6 -> 2
-2,1 -> -2
-1,3 -> -1
-1,5 -> -2
privateint round(double d){double dAbs =Math.abs(d);int i =(int) dAbs;double result = dAbs -(double) i;if(result<0.5){return d<0?-i : i;}else{return d<0?-(i+1): i+1;}}
Vous pouvez modifier la condition (résultat <0,5) à votre guise.
Je suis d'accord avec la réponse de l'anivaleur. Mais si vous devez simplement arrondir au nombre entier le plus élevé, vous pouvez aimer ci-dessous: double decimalNumber = 4.56777; System.out.println (new Float (Math.round (decimalNumber))); Sortie: 5
Smeet
3
import java.math.*;publicclassTestRound11{publicstaticvoid main(String args[]){double d =3.1537;BigDecimal bd =newBigDecimal(d);
bd = bd.setScale(2,BigDecimal.ROUND_HALF_UP);// output is 3.15System.out.println(d +" : "+ round(d,2));// output is 3.154System.out.println(d +" : "+ round(d,3));}publicstaticdouble round(double d,int decimalPlace){// see the Javadoc about why we use a String in the constructor// http://java.sun.com/j2se/1.5.0/docs/api/java/math/BigDecimal.html#BigDecimal(double)BigDecimal bd =newBigDecimal(Double.toString(d));
bd = bd.setScale(decimalPlace,BigDecimal.ROUND_HALF_UP);return bd.doubleValue();}}
La fonction Math.round est surchargée Lorsqu'elle reçoit une valeur flottante, elle vous donnera un int. Par exemple, cela fonctionnerait.
int a=Math.round(1.7f);
Quand il reçoit une valeur double, il vous donnera un long, donc vous devez le transtyper en int.
int a=(int)Math.round(1.7);
Ceci est fait pour éviter une perte de précision. Votre double valeur est de 64 bits, mais votre variable int ne peut stocker que 32 bits, elle la convertit donc simplement en long, qui est de 64 bits, mais vous pouvez la convertir en 32 bits comme expliqué ci-dessus.
Vous devez vraiment publier un exemple plus complet pour que nous puissions voir ce que vous essayez de faire. D'après ce que vous avez publié, voici ce que je peux voir. Premièrement, il n'y a pas de round()méthode intégrée . Vous devez soit appeler Math.round(n), soit importer statiquement Math.round, puis l'appeler comme vous l'avez fait.
round()
méthode dans la même classe? Avez-vousimport static java.lang.Math.*
? Etc .. Il y a beaucoup de manières d'arrondir les nombres et donc aussi beaucoup de réponses possibles. En d'autres termes, votre question est vague et ambiguë et ne peut pas être raisonnablement répondu dans sa forme actuelle. Il tourne dans le noir.Réponses:
Quel est le type de retour de la
round()
méthode dans l'extrait de code?Si c'est la
Math.round()
méthode, elle renvoie un Long lorsque le paramètre d'entrée est Double.Donc, vous devrez convertir la valeur de retour:
la source
Si vous n'aimez pas Math.round (), vous pouvez également utiliser cette approche simple:
la source
Math.round()
: stackoverflow.com/a/6468757/1715716Math.round()
, ce qui fait «littéralement» la même chose que la solution que vous proposez, c'est tout. À votre santé.0.5
?Arrondir le double à l' entier "le plus proche" comme ceci:
1,4 -> 1
1,6 -> 2
-2,1 -> -2
-1,3 -> -1
-1,5 -> -2
Vous pouvez modifier la condition (résultat <0,5) à votre guise.
la source
la source
La fonction Math.round est surchargée Lorsqu'elle reçoit une valeur flottante, elle vous donnera un int. Par exemple, cela fonctionnerait.
Quand il reçoit une valeur double, il vous donnera un long, donc vous devez le transtyper en int.
Ceci est fait pour éviter une perte de précision. Votre double valeur est de 64 bits, mais votre variable int ne peut stocker que 32 bits, elle la convertit donc simplement en long, qui est de 64 bits, mais vous pouvez la convertir en 32 bits comme expliqué ci-dessus.
la source
La documentation de
Math.round
dit:Pas besoin de lancer
int
. Peut-être que cela a changé par rapport au passé.la source
la source
Vous devez vraiment publier un exemple plus complet pour que nous puissions voir ce que vous essayez de faire. D'après ce que vous avez publié, voici ce que je peux voir. Premièrement, il n'y a pas de
round()
méthode intégrée . Vous devez soit appelerMath.round(n)
, soit importer statiquementMath.round
, puis l'appeler comme vous l'avez fait.la source