← Back to team overview

c2c-oerpscenario team mailing list archive

[Bug 881356] [NEW] Floating Point / Rounding issue in stock partial picking wizard

 

Public bug reported:

We encountered an Floating Point rounding issue, in the Partial Picking
wizard (stock/wizard/stock_partial_picking.py, do_partial)

"Processing quantity 390.268 kg for $PRODUCT is larger than the
available quantity 390.268 kg."

(Decimal Precision of Product UoM is set to 3, UoM Rounding for kg is
0.001)

OK, so I added an output of the test

if calc_qty > move.move_id.product_qty:
390.268 > 390.268

As one would say, 390.268 > 390.268 should be false...

But:
calc_qty - move.move_id.product_qty => 390.268 - 390.268 is 5.68434188608e-14
This is beyond the default python %s rounding of 6 decimals (to understand the 390.268 > 290.268 output above)


So here is a real problem with rounding precision and float (instead of decimal) data type.


I changed the query to regard decimal precision:

prec = dp.get_precision('Product UoM')(cr)[1] or 0
if int(calc_qty * (10**prec)) > int(move.move_id.product_qty * (10**prec)):

and it works fine.

** Affects: openobject-addons
     Importance: Undecided
         Status: New

-- 
You received this bug notification because you are a member of C2C
OERPScenario, which is subscribed to OpenERP Project Group.
https://bugs.launchpad.net/bugs/881356

Title:
  Floating Point / Rounding issue in stock partial picking wizard

Status in OpenERP Addons (modules):
  New

Bug description:
  We encountered an Floating Point rounding issue, in the Partial
  Picking wizard (stock/wizard/stock_partial_picking.py, do_partial)

  "Processing quantity 390.268 kg for $PRODUCT is larger than the
  available quantity 390.268 kg."

  (Decimal Precision of Product UoM is set to 3, UoM Rounding for kg is
  0.001)

  OK, so I added an output of the test

  if calc_qty > move.move_id.product_qty:
  390.268 > 390.268

  As one would say, 390.268 > 390.268 should be false...

  But:
  calc_qty - move.move_id.product_qty => 390.268 - 390.268 is 5.68434188608e-14
  This is beyond the default python %s rounding of 6 decimals (to understand the 390.268 > 290.268 output above)

  
  So here is a real problem with rounding precision and float (instead of decimal) data type.

  
  I changed the query to regard decimal precision:

  prec = dp.get_precision('Product UoM')(cr)[1] or 0
  if int(calc_qty * (10**prec)) > int(move.move_id.product_qty * (10**prec)):

  and it works fine.

To manage notifications about this bug go to:
https://bugs.launchpad.net/openobject-addons/+bug/881356/+subscriptions


Follow ups

References