2011-04-15 22 views
9

En Java estoy tratando de encontrar una manera eficiente de redondear un BigDecimal a dos decimales, hacia arriba o hacia abajo en función de una condición.Redondeo eficiente de BigDecimal Arriba y abajo a dos decimales

IF condition true then: 
    12.390 ---> 12.39 
    12.391 ---> 12.40 
    12.395 ---> 12.40 
    12.399 ---> 12.40 

If condition false then: 
    12.390 ---> 12.39 
    12.391 ---> 12.39 
    12.395 ---> 12.39 
    12.399 ---> 12.39 

¿Cuál es la forma más eficiente de lograr esto?

+0

¿Está usted sólo va a convertir en una cadena o mostrarlo, o se va a utilizar de alguna otra ¿camino? –

+0

Se pasa a un método de biblioteca de terceros que toma un BigDecimal. La biblioteca tomará el valor y lo agregará a un mensaje de cadena. – richs

Respuesta

25
public static BigDecimal round(BigDecimal d, int scale, boolean roundUp) { 
    int mode = (roundUp) ? BigDecimal.ROUND_UP : BigDecimal.ROUND_DOWN; 
    return d.setScale(scale, mode); 
} 
round(new BigDecimal("12.390"), 2, true); // => 12.39 
round(new BigDecimal("12.391"), 2, true); // => 12.40 
round(new BigDecimal("12.391"), 2, false); // => 12.39 
round(new BigDecimal("12.399"), 2, false); // => 12.39 
+7

El modo debe ser RoundingMode.FLOOR y RoundingMode.CEILING en lugar de BigDecimal.ROUND_UP y BigDecimal.ROUND_DOWN. –

1
num = num.setScale(condition ? RoundingMode.UP : RoundingMode.DOWN); 

Pero tenga en cuenta que su especificación no está del todo claro cuando se trata de números negativos. Eche un vistazo a los diversos modos de redondeo en el API doc y vea exactamente lo que necesita.

1

que sugieren lo siguiente (de pie sobre los hombros de gigantes ...):

public BigDecimal roundNumber(final BigDecimal number, final boolean isFloor){ 
    return number.setScale(2, isFloor ? RoundingMode.FLOOR 
             : RoundingMode.CEILING); 
} 
Cuestiones relacionadas