## Precision and scale in BigDecimal and MathContext

Lately, after publishing the previous post, a friend of mine
passed me a snipped of `BigDecimal`

code. He was wondering, why the following execution:

```
BigDecimal a = new BigDecimal(2.9);
BigDecimal b = new BigDecimal(4000);
MathContext mc = new MathContext(2, RoundingMode.HALF_DOWN);
BigDecimal r1 = a.multiply(b, mc);
BigDecimal r2 = a.multiply(b).setScale(2, RoundingMode.HALF_DOWN);
System.out.println("r1 = " + r1);
System.out.println("r2 = " + r2);
```

is returning different values for `r1`

and `r2`

:

r1 = 1.2E+4

r2 = 11600.00

Well, at first glance it seems that `r1`

differs from `r2`

in only one thing: the `r1`

is using
RoundingMode through
MathContext object, while the `r2`

is using
the `RoundingMode`

through
setScale(-) method.

But when you look at the JavaDocs, you’ll find that the
MathContext constructor
is accepting **not a scale** argument but a **precision** one:

MathContext(intĀ setPrecision, RoundingMode setRoundingMode)

Therefore, creating a `MathContext`

object as follows:

```
MathContext mc = new MathContext(2, RoundingMode.HALF_DOWN);
```

defines a `MathContext`

object with **precision** value set to 2.

So, the below operation:

```
MathContext mc = new MathContext(2, RoundingMode.HALF_DOWN);
BigDecimal r1 = a.multiply(b, mc);
```

is actually doing following things:

- multiple the
`a`

value (2.9) by`b`

value (4000) which results in**11600**, - set the precision to given value (2) which results in
**11[.600]**, - round this value using given RoundingMode
HALF_DOWN, which gives you the value of
**12000**(1.2E+4).

So, the most important lesson from this case is to read JavaDocs carefully and if you’re not sure – read it once again ;-)