2012-04-13 26 views
9

Diamo un'occhiata alle seguenti affermazioni in Java.Arrotondamento con DecimalFormat in Java

System.out.println(new DecimalFormat("0").format(2.4)); //returns 2 

System.out.println(new DecimalFormat("0").format(2.5)); //returns 2 <---Concentrate here 
System.out.println(Math.round(2.5));     //returns 3 

System.out.println(new DecimalFormat("0").format(2.6)); //returns 3 
System.out.println(new DecimalFormat("0").format(3.5)); //returns 4 

Nelle dichiarazioni precedenti, tutti gli altri casi sono ovvi tranne quanto segue.

System.out.println(new DecimalFormat("0").format(2.5)); 

Dovrebbe restituire 3 ma restituisce 2. Come?

risposta

9

Questo è un comportamento intenzionale. Da the documentation:

arrotondamento

DecimalFormat utilizza mezza anche arrotondamento (vedi ROUND_HALF_EVEN) per la formattazione.

Circa ROUND_HALF_EVEN:

modalità di arrotondamento per arrotondare verso il "vicino più prossimo" a meno che entrambi i vicini siano equidistanti, nel qual caso, rotondo verso il prossimo ancora. Si comporta come per ROUND_HALF_UP se la cifra a sinistra della frazione scartata è dispari; si comporta come per ROUND_HALF_DOWN se è pari. Si noti che questa è la modalità di arrotondamento che riduce al minimo l'errore cumulativo se applicato ripetutamente su una sequenza di calcoli.

Questo è anche noto come arrotondamento del banchiere.

Math.Round invece utilizza la seguente formula, che è "normale" arrotondamento:

(long)Math.floor(a + 0.5d) 
14

La modalità di arrotondamento predefinita di DecimalFormat è RoundingMode.HALF_EVEN. Ciò significa che arrotonda o arrotonda se il numero è più vicino al prossimo vicino. Quando il numero è esattamente tra due vicini (nel tuo caso, 2 e 3), arrotonda al numero pari più vicino (nel tuo caso, 2).

Come si può vedere, quando si è tentato con 3.5, è arrotondato a 4.

Se si desidera che il comportamento più "intuitivo", chiamare setRoundingMode(RoundingMode.HALF_UP) http://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html#setRoundingMode(java.math.RoundingMode)

questo è lo stesso di HALF_EVEN, ma se il numero è esattamente tra due vicini, arriverà sempre verso l'alto.