Bigdecimal division problem

M

manzur

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);
 
B

Bart Cremers

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
 
M

manzur

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.
 
B

Bart Cremers

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
 
P

Patricia Shanahan

manzur said:
bart

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,480
Members
44,900
Latest member
Nell636132

Latest Threads

Top