Comment arrondir un chiffre à Groovy?

comment arrondir un chiffre à Groovy? Je voudrais garder 2 décimales.

par exemple (pseudo-code):

round(1.2334695) = 1.23
round(1.2686589) = 1.27
27
demandé sur cdeszaq 2010-12-30 09:35:32

9 réponses

Vous pouvez utiliser:

Math.round(x * 100) / 100

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

27
répondu Matthew Flaschen 2010-12-30 06:42:04

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
24
répondu john Smith 2013-08-21 09:48:20

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
17
répondu sjtai 2010-12-30 11:42:32

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

11
répondu Sean Patrick Floyd 2010-12-30 06:48:12

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

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

Source: arrondir les nombres dans Groovy

8
répondu 10GritSandpaper 2015-12-01 16:44:54

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()}"
5
répondu lospejos 2016-09-16 14:11:11

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.

2
répondu cdeszaq 2013-10-08 15:05:55

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.

1
répondu r2d2oid 2015-05-25 22:02:46

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
0
répondu kpie 2018-03-10 23:15:30