Java BigDecimal: arrotondato al valore intero più vicino

Ho bisogno dei seguenti risultati

100.12 -> 100.00 100.44 -> 100.00 100.50 -> 101.00 100.75 -> 101.00 

.round() o .setScale() ? Come faccio a fare questo?

È ansible utilizzare setScale() per ridurre a zero il numero di cifre frazionarie. Supponendo che il value contenga il valore da arrotondare:

 BigDecimal scaled = value.setScale(0, RoundingMode.HALF_UP); System.out.println(value + " -> " + scaled); 

L’utilizzo di round() è un po ‘più complicato in quanto richiede di specificare il numero di cifre da conservare. Nei tuoi esempi questo sarebbe 3, ma questo non è valido per tutti i valori:

 BigDecimal rounded = value.round(new MathContext(3, RoundingMode.HALF_UP)); System.out.println(value + " -> " + rounded); 

(Si noti che BigDecimal oggetti BigDecimal sono immutabili, sia setScale che round restituiranno un nuovo object.)

Se vado dalla risposta di Grodriguez

 System.out.println("" + value); value = value.setScale(0, BigDecimal.ROUND_HALF_UP); System.out.println("" + value); 

Questo è l’output

 100.23 -> 100 100.77 -> 101 

Che non è proprio quello che voglio, così ho finito per fare questo ..

 System.out.println("" + value); value = value.setScale(0, BigDecimal.ROUND_HALF_UP); value = value.setScale(2, BigDecimal.ROUND_HALF_UP); System.out.println("" + value); 

Questo è quello che ottengo

 100.23 -> 100.00 100.77 -> 101.00 

Questo risolve il mio problema per ora ..:) Grazie a tutti.

Ecco una soluzione terribilmente complicata, ma funziona:

 public static BigDecimal roundBigDecimal(final BigDecimal input){ return input.round( new MathContext( input.toBigInteger().toString().length(), RoundingMode.HALF_UP ) ); } 

Codice di prova:

 List bigDecimals = Arrays.asList(new BigDecimal("100.12"), new BigDecimal("100.44"), new BigDecimal("100.50"), new BigDecimal("100.75")); for(final BigDecimal bd : bigDecimals){ System.out.println(roundBigDecimal(bd).toPlainString()); } 

Produzione:

100
100
101
101

Basta guardare:

http://download.oracle.com/javase/6/docs/api/java/math/BigDecimal.html#ROUND_HALF_UP

e:

 setScale(int precision, int roundingMode) 

O se si utilizza Java 6, quindi

http://download.oracle.com/javase/6/docs/api/java/math/RoundingMode.html#HALF_UP

http://download.oracle.com/javase/6/docs/api/java/math/MathContext.html

e nemmeno:

 setScale(int precision, RoundingMode mode); round(MathContext mc); 

Non penso che tu possa arrotondarlo in un unico comando. Provare

  ArrayList list = new ArrayList(); list.add(new BigDecimal("100.12")); list.add(new BigDecimal("100.44")); list.add(new BigDecimal("100.50")); list.add(new BigDecimal("100.75")); for (BigDecimal bd : list){ System.out.println(bd+" -> "+bd.setScale(0,RoundingMode.HALF_UP).setScale(2)); } Output: 100.12 -> 100.00 100.44 -> 100.00 100.50 -> 101.00 100.75 -> 101.00 

Ho testato per il resto dei tuoi esempi e restituisce i valori desiderati, ma non ne garantisco la correttezza.

Tu vuoi

 round(new MathContext(0)); // or perhaps another math context with rounding mode HALF_UP