Velocity Reviews > Java > Bigdecimal division problem

# Bigdecimal division problem

manzur
Guest
Posts: n/a

 02-23-2006
For the below Code snippet iam expecting 3333333.4 but iam getting
4E+6.Could any one help me to understand the logic. thanks in advance

BigDecimal quotient = BigDecimal.valueOf(10000000.0).divide(new
BigDecimal(3),RoundingMode.CEILING);

Bart Cremers
Guest
Posts: n/a

 02-23-2006
You'll need to set the scaling on your BigDecimal to the correct value
before working on it. The way BigDecimal works is that it sets the
scale to:

"The scale of the returned BigDecimal is the smallest value such that
(10scale × val) is an integer."

In your case this is -6. Set the scale to 1 to get what you want:

BigDecimal quotient =
BigDecimal.valueOf(10000000.0).setScale(1).divide( new
BigDecimal(3),RoundingMode.CEILING);

Bart

manzur
Guest
Posts: n/a

 02-23-2006
bart

>From the ApI i found that

If zero or positive, the scale is the number of digits to the right
of the decimal point. If negative, the unscaled value of the number is
multiplied by ten to the power of the negation of the scale. The value
of the number represented by the BigDecimal is therefore (unscaledValue
× 10-scale).

So i think that there is no need to set the scale explicitly for
positive numbers and the dividend in my code is also positive.

manzur
Guest
Posts: n/a

 02-23-2006
bart
but iam getting wht i want by following your process

Bart Cremers
Guest
Posts: n/a

 02-23-2006
The sentence in quotes comes from the API as well. It's sometimes a
problem to find the correct documentation in the API docs.

But anyway, you get what you want...

Bart

Patricia Shanahan
Guest
Posts: n/a

 02-23-2006
manzur wrote:
> bart
>
>>From the ApI i found that

> If zero or positive, the scale is the number of digits to the right
> of the decimal point. If negative, the unscaled value of the number is
> multiplied by ten to the power of the negation of the scale. The value
> of the number represented by the BigDecimal is therefore (unscaledValue
> × 10-scale).
>
> So i think that there is no need to set the scale explicitly for
> positive numbers and the dividend in my code is also positive.
>

The "zero or positive" refers the scale, not the number.
BigDecimal.valueOf(10000000.0) is equivalent to new BigDecimal("1.0E7")
and so has scale -6, unscaled value 10.

Using a double literal in BigDecimal valueOf is equivalent to conversion
of the string representation of the literal to a double, conversion of
the double to a String, and construction of a BigDecimal from that
String. There is a risk of rounding errors, as well as unintended scaling.

Unless there is some specific reason to involve doubles, I generally
find it better to stick to direct construction from a String:

new BigDecimal("10000000")

Patricia