Ohh, damn. I just fixed this before seeing this mail... drat...
-- Glen
----- Original Message -----
From: "Andrew C. Oliver" <[EMAIL PROTECTED]>
To: "Rolf-J�rgen Moll" <[EMAIL PROTECTED]>;
<[EMAIL PROTECTED]>
Sent: Saturday, April 20, 2002 3:50 AM
Subject: Re: POI -> Excel: Bug in decoding floating numbers
> Don't take this the wrong way, but please don't email me this stuff
> directly, please follow the procedure of creating a patch with cvs diff
> -u and posting it in bugzilla with [PATCH] in the subject. You've
> tracked down a much needed bugfix, but sending it to me is the slowest
> possible way to get it applied.
>
> -Andy "the POI bottleneck"
>
> Rolf-J�rgen Moll wrote:
>
> >Dear Oliver,
> >
> >we are using POI to import data from excel sheets into our application
> >(financial accounting and planning).
> >
> >
> >It seems that I found a bug in the decodeNumber-methods of RKRecord and
> >MulRKRecord. When you try to read out the value 9324.62 from a cell,
without
> >my modifications it will be encoded to 9324.625!
> >
> >With the modifications it works properly!
> >
> >It would be great if you could update the source in the POI-project and
if
> >you could inform me about this.
> >
> >Open source is really great! If there's a bug, you have the chance to
find
> >and fix it.
> >
> >
> >The proper code is for both classes RKRecord and MulRKRecord:
> >
> > private static double decodeNumber(int number)
> > {
> > long raw_number = number;
> >
> > // mask off the two low-order bits, 'cause they're not part of
> > // the number
> > // old: raw_number &= -3;
> > raw_number = raw_number >> 2; // new
> >
> > double rvalue = 0;
> >
> > if ((number & 0x02) == 0x02)
> > {
> >
> > // ok, it's just a plain ol' int; we can handle this
> > // trivially by right-shifting and casting
> > // old: rvalue = ( double ) (raw_number >> 2);
> > rvalue = ( double ) (raw_number); // new
> > }
> > else
> > {
> >
> > // also trivial, but not as obvious ... left shift the
> > // bits high and use that clever static method in Double
> > // to convert the resulting bit image to a double
> > // old rvalue = Double.longBitsToDouble(raw_number << 32);
> > rvalue = Double.longBitsToDouble(raw_number << 34);
> > }
> > if ((number & 0x01) == 0x01)
> > {
> >
> > // low-order bit says divide by 100, and so we do. Why?
> > // 'cause that's what the algorithm says. Can't fight city
> > // hall, especially if it's the city of Redmond
> > rvalue /= 100;
> > }
> > return rvalue;
> > }
> >
> >Sincerely yours,
> >
> >ROLF-JUERGEN MOLL
> >--------------------------------------------
> >LucaNet AG
> >Hanauer Str. 14b
> >80992 M�nchen
> >Telefon: +49 (089) 51 999 804
> >Telefax: +49 (089) 51 999 796
> >
> >www.lucanet.de
> >--------------------------------------------
> >
> >
> >
>
>
>