wood burning stoves 2.0*
The moose likes Java in General and the fly likes Is this bug or am I missing sth? Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login
JavaRanch » Java Forums » Java » Java in General
Bookmark "Is this bug or am I missing sth?" Watch "Is this bug or am I missing sth?" New topic
Author

Is this bug or am I missing sth?

Jay Feng
Greenhorn

Joined: Oct 03, 2001
Posts: 2
try to run the following code:
//code starts here
long n16 = 9999999999999999L;//16 9s
BigDecimal bd = new BigDecimal(n16);
System.out.println("n16= " + n16);
System.out.println("bd= " + bd);
System.out.println("bd.longValue= " + bd.longValue());
//code ends here
//the result is
n16= 9999999999999999 #correct
bd= 100000000000000000 #wrong
bd.longValue= 1000000000000000 #wrong
If it's not a bug, how can I safe convert "n16" into a BigDecimal?
thanks.
Jay
Jay Feng
Greenhorn

Joined: Oct 03, 2001
Posts: 2
Never mind. It's not bug.
In case anybody want to know, here's the reason.
Before the long is converted into a BigDecimal, it has to be converted into a double(implicit cast), where some precision is lost.
"Conversion of an int or a long value to float, or of a long value to double, may lose precision, that is, the result may lose some of the least significant bits of the value; the resulting floating-point value is a correctly rounded version of the integer value, using IEEE 754 round to nearest mode."(Quoted from VM spec).
Jim Yingst
Wanderer
Sheriff

Joined: Jan 30, 2000
Posts: 18671
Use BigDecimal.valueOf(long) for this. This illustrates the main problem with static factory methods - they're easy to overlook in an API when you're looking for a constructor.


"I'm not back." - Bill Harding, Twister
 
I agree. Here's the link: http://aspose.com/file-tools
 
subject: Is this bug or am I missing sth?