Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Java (http://www.velocityreviews.com/forums/f30-java.html)
-   -   Problem with Double to BigDecimal Conversion (http://www.velocityreviews.com/forums/t125913-problem-with-double-to-bigdecimal-conversion.html)

 Forrest Hump 08-22-2003 01:23 PM

Problem with Double to BigDecimal Conversion

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.162499999999999644728632119949907064437866210937 5.
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);

 Kent Paul Dolan 08-22-2003 02:17 PM

Re: Problem with Double to BigDecimal Conversion

"Forrest Hump" <forresthump@webmail.co.za> 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.162499999999999644728632119949907064437866210937 5.
> 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

 Dario 08-22-2003 02:36 PM

Re: Problem with Double to BigDecimal Conversion

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 08-22-2003 02:39 PM

Re: Problem with Double to BigDecimal Conversion

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

 Mark Meyer 08-22-2003 03:53 PM

Re: Problem with Double to BigDecimal Conversion

In our last episode, "Kent Paul Dolan" <xanthian@well.com> 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 mmeyer@raytheon.com
Raytheon Voice (972)344-0830 Fax (972)344-6840

 All times are GMT. The time now is 10:01 AM.