Java's Bigdecimal.divide and rounding
As specified in javadoc, a BigDecimal
is defined by an integer value and a scale.
The value of the number represented by the BigDecimal is therefore (unscaledValue × 10^(-scale)).
So BigDecimal("1761e+5")
has scale -5 and BigDecimal(176100000)
has scale 0.
The division of the two BigDecimal
is done using the -5 and 0 scales respectively because the scales are not specified when dividing. The divide
documentation explains why the results are different.
divide
public BigDecimal divide(BigDecimal divisor)
Returns a
BigDecimal
whose value is(this / divisor)
, and whose preferred scale is(this.scale() - divisor.scale())
; if the exact quotient cannot be represented (because it has a non-terminating decimal expansion) anArithmeticException
is thrown.Parameters:
divisor
- value by which this BigDecimal is to be divided.Returns:
this / divisor
Throws:
ArithmeticException
— if the exact quotient does not have a terminating decimal expansionSince:
1.5
If you specify a scale when dividing, e.g. dividendo.divide(BigDecimal.valueOf(1000), 0, RoundingMode.HALF_UP)
you will get the same result.
The expressions new BigDecimal("176100000")
and new BigDecimal("1761e+5")
are not equal. BigDecimal
keeps track of both value, and precision.
BigDecimal("176100000")
has 9 digits of precision and is represented internally as the BigInteger("176100000")
, multiplied by 1. BigDecimal("1761e+5")
has 4 digits of precision and is represented internally as the BigInteger("1761")
, multiplied by 100000.
When you a divide a BigDecimal
by a value, the result respects the digits of precision, resulting in different outputs for seemingly equal values.
for your division with BigDecimal.
dividendo.divide(divisor,2,RoundingMode.CEILING)//00.00 nothing for up and nothing for down
in this operation have a precision for two decimals.