Эффективное округление BigDecimal вверх и вниз до двух знаков после запятой

В java я пытаюсь найти эффективный способ округления BigDecimal до двух знаков после запятой, вверх или вниз в зависимости от условия.

 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

Каков наиболее эффективный способ добиться этого?


person richs    schedule 15.04.2011    source источник
comment
Вы просто собираетесь преобразовать его в строку или отобразить, или вы собираетесь использовать его как-то иначе?   -  person Robin Green    schedule 16.04.2011
comment
Он передается методу сторонней библиотеки, который принимает BigDecimal. Затем библиотека возьмет значение и добавит его к строковому сообщению.   -  person richs    schedule 16.04.2011


Ответы (3)


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

Но обратите внимание, что ваша спецификация не совсем ясна, когда речь идет об отрицательных числах. Ознакомьтесь с различными режимами округления в документе по API и посмотрите, что именно вам нужно.

person Michael Borgwardt    schedule 15.04.2011

Предлагаю следующее (стоя на плечах гигантов...):

public BigDecimal roundNumber(final BigDecimal number, final boolean isFloor){
     return number.setScale(2, isFloor ? RoundingMode.FLOOR 
                                       : RoundingMode.CEILING);
}
person Mr. Nobody    schedule 15.04.2011

person    schedule
comment
Режим должен быть RoundingMode.FLOOR и RoundingMode.CEILING вместо BigDecimal.ROUND_UP и BigDecimal.ROUND_DOWN. - person Mr. Nobody; 18.04.2011