2014-09-22 11 views
6

sto cercando di arrotondare i valori doppi a 2 cifre decimali, ma non funziona in tutti gli scenariJava Doppio Turno off per 2 decimali sempre

public static double round(double value, int places) { 
    if (places < 0) throw new IllegalArgumentException(); 

    BigDecimal bd = new BigDecimal(value); 
    bd = bd.setScale(places, RoundingMode.HALF_UP); 
    return bd.doubleValue(); 
} 

public static void main(String[] args) { 
    System.out.println(round(25.0,2)); //25.0 - expected 25.00 
    System.out.println(round(25.00d,2)); //25.0 - expected 25.00 
    System.out.println(round(25,2)); //25.0 - expected 25.00 
    System.out.println(round(25.666,2)); //25.67 
} 

In breve, non importa se esiste o no decimale, mantenere sempre i valori fino a 2 decimali anche se è necessario aggiungere ulteriori zeri.

Qualsiasi aiuto è apprezzato!

+3

Potrebbe essere necessario utilizzare il formato decimale anziché setScale. –

risposta

11

Ci sono due cose che possono essere migliorate nel codice.

Innanzitutto, colata a doppio BigDecimal per arrotondare è approccio molto inefficiente. Si dovrebbe usare Math.round invece:

double value = 1.125879D; 
    double valueRounded = Math.round(value * 100D)/100D; 

In secondo luogo, quando si stampa o si converte un numero reale a stringa, si può considerare l'utilizzo System.out.printf o String.Format. Nel tuo caso, usando il formato "% .2f" fa il trucco.

System.out.printf("%.2f", valueRounded); 
+1

La "prima" parte è necessaria solo se è necessario ottenere il valore arrotondato come doppio. Anche la formattazione con precisione rende corretto l'arrotondamento, quindi se l'obiettivo finale del programma è ottenere una rappresentazione in forma di stringa del valore arrotondato, tutto ciò che serve è 'String.format' o' System.out.printf'. – Aivean

+0

Questo non è in realtà arrotondamento come 'RoundingMode.HALF_UP', però. In realtà, non è affatto un arrotondamento, basta troncare. –

+2

@DavidConrad Dal mio punto di vista entrambi gli esempi funzionano secondo l'algoritmo RoundingMode.HALF_UP. Inoltre, String.format è [dichiarato di utilizzare questo algoritmo] (http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax) (ricerca 'round half up algorithm' parola chiave lì). – Aivean

2

si sta convertendo BigDecimal torna a double che tagliare essenzialmente gli zeri finali.

Si può tornare sia BigDecimal o BigDecimal.toPlainString().

public static String round(double value, int places) { 
    if (places < 0) throw new IllegalArgumentException(); 

    BigDecimal bd = new BigDecimal(value); 
    bd = bd.setScale(places, RoundingMode.HALF_UP); 
    return bd.toPlainString(); 
} 
4

Io uso la funzione di formattazione() della classe String. Codice molto più semplice Il 2 in "% .2f" indica il numero di cifre dopo il punto decimale che si desidera visualizzare. Il f in "% .2f" indica che si sta stampando un numero in virgola mobile. Ecco la documentazione sulla formattazione di una stringa (http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax)

double number = 12.34567; 
System.out.println(String.format("%.2f", number)); 
2

Questo funziona per voi:

public static void main(String[] args) { 

    DecimalFormat two = new DecimalFormat("0.00"); //Make new decimal format 

    System.out.println(two.format(25.0)); 

    System.out.println(two.format(25.00d)); 

    System.out.println(two.format(25)); 

    System.out.println(two.format(25.666)); 

}