On 10/03/10 00:06 +0100, Cédric Krier wrote:
> On 09/03/10 23:50 +0100, Cédric Krier wrote:
> > On 09/03/10 18:41 +0100, Cédric Krier wrote:
> > > On 09/03/10 13:35 +0100, Cédric Krier wrote:
> > > > Here is a patch to fix digits issue in product uom due to new 
> > > > validation of
> > > > digits.
> > > > 
> > > > Please review this at http://codereview.appspot.com/325042/show
> > > > 
> > > 
> > > I'm facing an issue.
> > > The float8 of postgresql can not store correctly the value:
> > >     1.093613298338
> > > It is rounded to:
> > >     1.09361329834
> > > 
> > > This value comes from the Yard UOM which is:
> > > 
> > >     1 yard = 0.9144 meters
> > > 
> > > So:
> > >     1 meter = round(1.0 / 0.9144, 12) meters = 1.093613298338
> > > 
> > > The issue is that when trying to compute back the 0.9144 with the rounded
> > > value we get:
> > > 
> > >     round(1.0 / 1.09361329834, 12) = 0.914399999998
> > > 
> > > But with the 12 digits value:
> > > 
> > >     round(1.0 / 1.093613298338, 12) = 0.9144
> > > 
> > > So float8 is not large enough to store the Yard conversion correctly. I
> > > propose to store rate and factor with numeric/decimal field instead of 
> > > float.
> > > The precision has no limit but it will require to convert into float when
> > > calling compute_qty(). This function is called in the stock module to 
> > > compute
> > > stock quantity, it is already well optimized to reduce the number of call 
> > > but
> > > it will be a little slower due to the convertion of Decimal into float 
> > > but I
> > > don't think we should care about.
> > > 
> > 
> > In fact, float8 are large enough so no need to switch to Decimal for this
> > reason. But I think it is still a good progress.
> > 
> > In fact the issue comes from psycopg2, it seems that it round float and
> > Decimal to 11 decimal digits.
> > Is there anybody aware of this? I will check the code source of psycopg2 to
> > understand.
> > 
> 
> I understood. pyscopg2 convert float and Decimal by using str function but
> according to [1], str gives only 12 significant digits. That is why the float
> value are rounded. I will see how I could make psycopg2 to use repr instead of
> str. And perhaps report issue to psycopg2.
> 
> [1] http://docs.python.org/tutorial/floatingpoint.html
> 

psycopg2 has been fixed [1] but it is not yet released. I will try to provide
a patch for trytond.

[1]
https://dndg.it/cgi-bin/gitweb.cgi?p=public/psycopg2.git;a=commit;h=7b730f3935c4bef8c2215edb1a03a2b15f80b2a0


-- 
Cédric Krier

B2CK SPRL
Rue de Rotterdam, 4
4000 Liège
Belgium
Tel: +32 472 54 46 59
Email/Jabber: [email protected]
Website: http://www.b2ck.com/

Attachment: pgpWVVwrGEDCa.pgp
Description: PGP signature

Reply via email to