Problem with Double to BigDecimal Conversion

Discussion in 'Java' started by Forrest Hump, Aug 22, 2003.

1. Forrest HumpGuest

Can anyone tell me why the code sample below returns a different value for
variable b_OLD ?

The value I get for bd1 is 4.1624999999999996447286321199499070644378662109375.
Why does Java not keep it as 4.1625 ?

----------------

double b_OLD = 4.1625;

java.math.BigDecimal bd1 = new java.math.BigDecimal( b_OLD );

System.out.println("BEFORE ROUNDING: " + bd1);

bd1 = bd1.setScale(0, java.math.BigDecimal.ROUND_CEILING);
System.out.println("AFTER ROUNDING: " + bd1);

Forrest Hump, Aug 22, 2003

2. Kent Paul DolanGuest

"Forrest Hump" <> wrote:

> Can anyone tell me why the code sample below returns a different value for
> variable b_OLD ?

> The value I get for bd1 is 4.1624999999999996447286321199499070644378662109375.
> Why does Java not keep it as 4.1625 ?

> double b_OLD = 4.1625;
>
> java.math.BigDecimal bd1 = new java.math.BigDecimal( b_OLD );

The usual reason: the number whose decimal representation is "4.1625"
cannot be exactly represented as a "binary number with binary point" in
any finite number of bits (and you only get 52 or so), and so the first
roughly 17 decimal digits of the BigDecimal representation are the best
that the double representation could do in binary when expressed instead
in decimal; what the rest is, I don't know, maybe trash, maybe the
remains of the roundoff back from binary to decimal.

xanthian.

--
Posted via Mailgate.ORG Server - http://www.Mailgate.ORG

Kent Paul Dolan, Aug 22, 2003

3. DarioGuest

Forrest Hump wrote:

> double b_OLD = 4.1625;
> java.math.BigDecimal bd1 = new java.math.BigDecimal( b_OLD );
> System.out.println("BEFORE ROUNDING: " + bd1);

Try:

java.math.BigDecimal bd1 = new java.math.BigDecimal("4.1625");

I hope this will solve your problem.

- Dario

Dario, Aug 22, 2003
4. DarioGuest

Forrest Hump wrote:

> double b_OLD = 4.1625;
> java.math.BigDecimal bd1 = new java.math.BigDecimal( b_OLD );
> System.out.println("BEFORE ROUNDING: " + bd1);

Try:

java.math.BigDecimal bd1 = new java.math.BigDecimal("4.1625");

I hope this will solve your problem.

- Dario

Dario, Aug 22, 2003
5. Mark MeyerGuest

In our last episode, "Kent Paul Dolan" <> wrote:
>The usual reason: the number whose decimal representation is "4.1625"
>cannot be exactly represented as a "binary number with binary point" in
>any finite number of bits (and you only get 52 or so), and so the first
>roughly 17 decimal digits of the BigDecimal representation are the best
>that the double representation could do in binary when expressed instead
>in decimal; what the rest is, I don't know, ...

The BigDecimal number representation is the exact decimal
representation of the double's binary approximation of 4.1625.

--
Mark Meyer

Mark Meyer
Raytheon Voice (972)344-0830 Fax (972)344-6840

Mark Meyer, Aug 22, 2003