Rounding BigDecimal to *always* have two decimal places

245,324
value = value.setScale(2, RoundingMode.CEILING)
Share:
245,324

Related videos on Youtube

Brad Mace
Author by

Brad Mace

Java and Perl programmer. I also use PHP but I'm trying to quit, honest.

Updated on July 08, 2022

Comments

  • Brad Mace
    Brad Mace almost 2 years

    I'm trying to round BigDecimal values up, to two decimal places.

    I'm using

    BigDecimal rounded = value.round(new MathContext(2, RoundingMode.CEILING));
    logger.trace("rounded {} to {}", value, rounded);
    

    but it doesn't do what I want consistently:

    rounded 0.819 to 0.82
    rounded 1.092 to 1.1
    rounded 1.365 to 1.4 // should be 1.37
    rounded 2.730 to 2.8 // should be 2.74
    rounded 0.819 to 0.82
    

    I don't care about significant digits, I just want two decimal places. How do I do this with BigDecimal? Or is there another class/library better suited to this?

    • Gilbert Le Blanc
      Gilbert Le Blanc about 11 years
      If you actually want to round, you would use RoundingMode.HALF_UP
  • Brad Mace
    Brad Mace about 11 years
    That does indeed work how I want. Is the difference simply that round() works with significant digits while setScale works with a fixed number of decimal places or is there more to it?
  • Grzegorz Dev
    Grzegorz Dev over 7 years
    Use RoundingMode.HALF_UP to do "typcal rounding". That is 1.111 gives 1.11 [CEILING gives 1.12]
  • silver
    silver almost 7 years
    Thanks for RoundingMode.HALF_UP. As per documentation it is the rounding method commonly taught in schools - what I needed.
  • Dale
    Dale about 6 years
    Take care if your values can be negative as in an accounting application. You may need to use RoundingMode.UP instead of CEILING
  • Jason Law
    Jason Law over 4 years
    Why does setScale(...) work? see BigDecimal setScale and round.