Comment arrondir un nombre dans Groovy? Je voudrais conserver 2 décimales.
Par exemple (pseudo-code):
round(1.2334695) = 1.23
round(1.2686589) = 1.27
Vous pouvez utiliser:
Math.round(x * 100) / 100
Si x
est un BigDecimal
(le par défaut dans Groovy), ce sera exact.
Si vous avez affaire à des doubles ou à des flotteurs
Vous pouvez simplement utiliser
assert xyz == 1.789
xyz.round(1) == 1.8
xyz.round(2) == 1.79
Utilisez mixin.
class Rounding {
public BigDecimal round(int n) {
return setScale(n, BigDecimal.ROUND_HALF_UP);
}
}
Ajoutez ceci à votre classe de démarrage et round () est une méthode de première classe de BigDecimal:
BigDecimal.mixin Rounding
Cas de test:
assert (new BigDecimal("1.27")) == (new BigDecimal("1.2686589").round(2))
assert (1.2686589).round(2) == 1.27
assert (1.2334695).round(2) == 1.23
Comme ça:
def f = 1.2334695;
println new DecimalFormat("#.##").format(f);
Ou comme ça:
println f.round (new MathContext(3));
Production:
1,23
Référence: Formatage d'un nombre décimal
Groovy ajoute une méthode round()
aux classes Double
et Float
, donc:
(123.456789f).round(2) == 123.46f
Source: arrondir les nombres dans Groovy
Probablement, plus Groovysh serait d'utiliser cet extrait (x as double).round(2)
comme ça:
def a = 5.2355434
println "a = $a, a.class = ${a.getClass()}"
def b = (a as double).round(2)
println "b = $b, b.class = ${b.getClass()}"
En travaillant à partir de la grande réponse de @ sjtai, voici le Mixin que j'utilise pour à peu près tous mes besoins d'arrondi décimal:
class Rounding {
public BigDecimal round(int decimalPlaces = 0, RoundingMode roundingMode = RoundingMode.HALF_EVEN) {
return setScale(decimalPlaces, roundingMode);
}
}
Si arrondi à un int
par défaut, et utilise une méthode d'arrondi "pair" (la réduction des erreurs statistiques par défaut est toujours une bonne chose), mais cela permet toujours à l'appelant de les remplacer facilement.
En regardant les réponses de @ sjtai et @ cdeszaq, vous n'avez pas besoin de vous mélanger avec mixin si vous définissez simplement une méthode comme celle-ci:
def bigDecimalRound(n,decimals){
return(n.setScale(decimals, BigDecimal.ROUND_HALF_UP))
}
C'est la méthode intégrée BigDecimal
setScale
qui effectue l'arrondi.
println(1.2334695.setScale(2, BigDecimal.ROUND_HALF_UP))
>> 1.23
Il convient également de noter que setScale accepte les arguments négatifs afin d'arrondir les choses à un ordre de grandeur plus grand, c'est-à-dire.
println(123.2334695.setScale(-1, BigDecimal.ROUND_HALF_UP))
>> 1.2E+2
aussi simple que cela:
YOUR_NUMBER = 1.234567
((int) YOUR_NUMBER * 100)/100
note: cela couperait les points décimaux supplémentaires; ça ne s'arrondit pas.