I’m having trouble with rounding. Specifically, after reading all the javadoc, I was expecting the following code:
int n = (integer between 0 and 9, included)
new BigDecimal(n + 0.555d).setScale(2, RoundingMode.HALF_UP).doubleValue()
to return n + 0.56. Instead, these are the return values for n from 0 to 4:
new BigDecimal(0.555d).setScale(2, RoundingMode.HALF_UP).doubleValue()
0.56
new BigDecimal(1.555d).setScale(2, RoundingMode.HALF_UP).doubleValue()
1.55
new BigDecimal(2.555d).setScale(2, RoundingMode.HALF_UP).doubleValue()
2.56
new BigDecimal(3.555d).setScale(2, RoundingMode.HALF_UP).doubleValue()
3.56
new BigDecimal(4.555d).setScale(2, RoundingMode.HALF_UP).doubleValue()
4.55
I have also tried to change the rounding mode:
int n = (integer between 0 and 9, included)
new BigDecimal(n + 0.555d).setScale(2, RoundingMode.HALF_DOWN).doubleValue()
expecting n + 0.55 as a result for each and every n. Instead, the return values are exactly the same as the previous example:
new BigDecimal(0.555d).setScale(2, RoundingMode.HALF_DOWN).doubleValue()
0.56
new BigDecimal(1.555d).setScale(2, RoundingMode.HALF_DOWN).doubleValue()
1.55
new BigDecimal(2.555d).setScale(2, RoundingMode.HALF_DOWN).doubleValue()
2.56
new BigDecimal(3.555d).setScale(2, RoundingMode.HALF_DOWN).doubleValue()
3.56
new BigDecimal(4.555d).setScale(2, RoundingMode.HALF_DOWN).doubleValue()
4.55
Am I missing something?
The problem you have is that double is not a precise representation and you are round based on this imprecise number.
prints
however
prints
This works because
BigDecimal.valueOfdoes some extra rounding based on how double would appear if you printed it.However I wouldn’t use BigDecimal unless performance/simplicity is not an issue.
prints
For more details Double your money again compares the performance of different ways of rounding.