From ccd5c2bc809d0e2df58a57b616f8b0c42e0d300f Mon Sep 17 00:00:00 2001 From: IEL Date: Fri, 23 Oct 2020 14:24:08 +0000 Subject: [PATCH] [FIX] pos_cash_rounding: fix "almost zero" error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TLDR: zero is not always zero in js STEPS: * On your POS, add a Cash rounding > Rounding precision 0.10 > Rounding method DOWN * Set a product with a Unit of Measure with 3 decimals (kg for instance) * In POS: - Make an order for 0.514 kg at 429.99€ + 0.510 kg at 429.99 + 0.60€ - The total of the order is 440.90 (exact total would be 440.90976) BEFORE: The total to pay is 440.80 AFTER: The total to pay is 440.90 WHY: * var total = round_pr(this.get_total_with_tax(), this.pos.cash_rounding[0].rounding); // 440.90000000000003 * var rounding_applied = total - this.get_total_with_tax(); // 5.684341886080802e-14 --- opw-2357917 closes odoo/odoo#60754 X-original-commit: 262a9dc935d74b30ffeaff6d6d88aac150793d6e Signed-off-by: pimodoo --- addons/point_of_sale/static/src/js/models.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/addons/point_of_sale/static/src/js/models.js b/addons/point_of_sale/static/src/js/models.js index 8c5254946d5..d1a1ed7fe6f 100644 --- a/addons/point_of_sale/static/src/js/models.js +++ b/addons/point_of_sale/static/src/js/models.js @@ -3262,7 +3262,10 @@ exports.Order = Backbone.Model.extend({ var rounding_applied = total - (this.pos.config['iface_tax_included'] === "total"? this.get_subtotal(): this.get_total_with_tax()); // because floor and ceil doesn't include decimals in calculation, we reuse the value of the half-up and adapt it. - if(this.pos.cash_rounding[0].rounding_method === "UP" && rounding_applied < 0) { + if (utils.float_is_zero(rounding_applied)){ + // https://xkcd.com/217/ + return 0; + } else if(this.pos.cash_rounding[0].rounding_method === "UP" && rounding_applied < 0) { rounding_applied += this.pos.cash_rounding[0].rounding; } else if(this.pos.cash_rounding[0].rounding_method === "DOWN" && rounding_applied > 0){