2010-12-30 1 views

risposta

25

È possibile utilizzare:

Math.round(x * 100)/100 

Se x è una BigDecimal (il default in Groovy), questo sarà esatto.

+1

Assicurati di assegnare la variabile al risultato di questa espressione - esempio: x = Math.round (x * 100)/100 –

11

Ti piace questa:

def f = 1.2334695; 
println new DecimalFormat("#.##").format(f); 

O come questa:

println f.round (new MathContext(3)); 

uscita:

1,23

Riferimento: Formatting a Decimal Number

+1

MathContext (3) specifica precisione totale di 3 numeri così ad esempio 12.34 diventerebbe 12.3 o 123.45 diventerebbe 123 – verglor

+0

potresti semplicemente passare un numero di MathContext .. –

17

Utilizzare mixin.

class Rounding { 
    public BigDecimal round(int n) { 
     return setScale(n, BigDecimal.ROUND_HALF_UP); 
    } 
} 

Aggiungi questo alla vostra classe di startup e rotondo() è un metodo di prima classe BigDecimal:

BigDecimal.mixin Rounding 

casi di 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 
+0

Questo è molto pericoloso, mixin scope è l'intera JVM, abbiamo avuto un problema oscuro in produzione quando una chiamata implicita a setScale da un metodo toString ha portato al nome della classe che dichiarava il mixin come output al posto del valore numerico (com. [email protected]) Probabilmente un problema di classLoading dato che lo script groovy viene caricato dinamicamente. Java 6 – Gab

21

se il vostro trattare con Double's o float's

è possibile semplicemente utilizzare

assert xyz == 1.789 
xyz.round(1) == 1.8 
xyz.round(2) == 1.79 
2

Lavorare da grande risposta di @ sjtai, questo è il Mixin che uso per quasi tutti i miei decimali di arrotondamento esigenze:

class Rounding { 
    public BigDecimal round(int decimalPlaces = 0, RoundingMode roundingMode = RoundingMode.HALF_EVEN) { 
     return setScale(decimalPlaces, roundingMode); 
    } 
} 

Se giri per un int di default, e utilizza un "ancora" metodo di arrotondamento (la riduzione dell'errore statistico di default è sempre una buona cosa), ma consente comunque al chiamante di sovrascriverli facilmente.

1

semplice come questo:

YOUR_NUMBER = 1.234567 
((int) YOUR_NUMBER * 100)/100 

nota: questo avrebbe tagliato i punti decimali in più; non arrotonda.

+0

Si arrotonda se si inizia con un numero negativo ... Questo non è arrotondato per il troncamento verso 0. – kpie

3

Probabilmente, più Groovysh modo sarebbe quello di utilizzare questo frammento (x as double).round(2) come questo:

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()}" 
+0

Non se si utilizza il valore numerico decimale predefinito di Groovy' BigDecimal perché quando si esegue il doppio di questo in un BigDecimal si ottiene brutta. – kpie

0

Looking at @ Sjtai di e risposte @ di cdeszaq non è necessario per confondersi con i mixin solo se si definisce un metodo come questo:

def bigDecimalRound(n,decimals){ 
    return(n.setScale(decimals, BigDecimal.ROUND_HALF_UP)) 
} 

E 'il metodo di BigDecimal integrato setScale che esegue l'arrotondamento.

println(1.2334695.setScale(2, BigDecimal.ROUND_HALF_UP)) 
>> 1.23 

Vale la pena notare che anche setScale accetta argomenti negativi per arrotondare attrattive grande ordine di grandezza, cioè

println(123.2334695.setScale(-1, BigDecimal.ROUND_HALF_UP)) 
>> 1.2E+2