Comment arrondir un chiffre à Groovy?
9 réponses
Vous pouvez utiliser:
Math.round(x * 100) / 100
Si x
est un BigDecimal
(par défaut dans Groovy), ce sera exacte.
si votre affaire avec des Doubles ou des flotteurs
vous pouvez tout 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 D'essai:
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 ceci:
def f = 1.2334695;
println new DecimalFormat("#.##").format(f);
Ou comme ceci:
println f.round (new MathContext(3));
Sortie:
1.23
Référence: formatage D'un nombre décimal
Groovy ajoute un round()
méthode Double
et Float
classes, donc:
(123.456789f).round(2) == 123.46f
Source: arrondir les nombres dans Groovy
probablement, plus Groovysh moyen serait d'utiliser cet extrait de code (x as double).round(2)
comme ceci:
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()}"
A partir de la grande réponse de @sjtai, c'est le Mixin que j'utilise pour presque 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 tours à un int
par défaut, et utilise un "même" méthode d'arrondi (réduction de l'erreur statistique par défaut est toujours une bonne chose), mais il permet à l'appelant de facilement remplacer ces.
aussi simple que cela:
YOUR_NUMBER = 1.234567
((int) YOUR_NUMBER * 100)/100
note: Ceci couperait les points décimaux supplémentaires; il ne s'arrondit pas.
en regardant les réponses de @sjtai et @cdeszaq vous n'avez pas besoin de vous mêler à mixin si vous définissez juste une méthode comme celle-ci:
def bigDecimalRound(n,decimals){
return(n.setScale(decimals, BigDecimal.ROUND_HALF_UP))
}
C'est le BigDecimal
méthode de construction setScale
qui effectue l'arrondissement.
println(1.2334695.setScale(2, BigDecimal.ROUND_HALF_UP))
>> 1.23
il est intéressant de noter aussi que setScale accepte les arguments négatifs afin de contourner les choses à un plus grand ordre de grandeur, i.e.
println(123.2334695.setScale(-1, BigDecimal.ROUND_HALF_UP))
>> 1.2E+2