Come arrotondare un numero in Groovy? Vorrei mantenere 2 cifre decimali.Come arrotondare un numero in Groovy?
Per esempio (pseudo-codice):
round(1.2334695) = 1.23
round(1.2686589) = 1.27
Come arrotondare un numero in Groovy? Vorrei mantenere 2 cifre decimali.Come arrotondare un numero in Groovy?
Per esempio (pseudo-codice):
round(1.2334695) = 1.23
round(1.2686589) = 1.27
È possibile utilizzare:
Math.round(x * 100)/100
Se x
è una BigDecimal
(il default in Groovy), questo sarà esatto.
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
MathContext (3) specifica precisione totale di 3 numeri così ad esempio 12.34 diventerebbe 12.3 o 123.45 diventerebbe 123 – verglor
potresti semplicemente passare un numero di MathContext .. –
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
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
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
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.
semplice come questo:
YOUR_NUMBER = 1.234567
((int) YOUR_NUMBER * 100)/100
nota: questo avrebbe tagliato i punti decimali in più; non arrotonda.
Si arrotonda se si inizia con un numero negativo ... Questo non è arrotondato per il troncamento verso 0. – kpie
Groovy aggiunge un metodo round()
alle classi Double
e Float
, quindi:
(123.456789f).round(2) == 123.46f
Fonte: Rounding Numbers in Groovy
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()}"
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
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
Assicurati di assegnare la variabile al risultato di questa espressione - esempio: x = Math.round (x * 100)/100 –