web-dev-qa-db-fra.com

Comment arrondir un nombre dans Groovy?

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
32
Georgian Citizen

Vous pouvez utiliser:

Math.round(x * 100) / 100

Si x est un BigDecimal (le par défaut dans Groovy), ce sera exact.

33
Matthew Flaschen

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
27
john Smith

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
18
sjtai

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

12
Sean Patrick Floyd

Groovy ajoute une méthode round() aux classes Double et Float, donc:

(123.456789f).round(2) == 123.46f

Source: arrondir les nombres dans Groovy

10
10GritSandpaper

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()}"
5
lospejos

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.

2
cdeszaq

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 BigDecimalsetScale 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
1
kpie

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.

1
Zahra