java – BigDecimal setScale and round
One important point that is alluded to but not directly addressed is the difference between precision and scale and how they are used in the two statements. precision is the total number of significant digits in a number. scale is the number of digits to the right of the decimal point.
The MathContext constructor only accepts precision and RoundingMode as arguments, and therefore scale is never specified in the first statement.
setScale() obviously accepts scale as an argument, as well as RoundingMode, however precision is never specified in the second statement.
If you move the decimal point one place to the right, the difference will become clear:
// 1. new BigDecimal(35.3456).round(new MathContext(4, RoundingMode.HALF_UP)); //result = 35.35 // 2. new BigDecimal(35.3456).setScale(4, RoundingMode.HALF_UP); // result = 35.3456
There is indeed a big difference, which you should keep in mind. setScale really set the scale of your number whereas round does round your number to the specified digits BUT it starts from the leftmost digit of exact result as mentioned within the jdk. So regarding your sample the results are the same, but try 0.0034 instead.
Heres my note about that on my blog: