[FIX] pos_cash_rounding: fix "almost zero" error

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 <pimodoo@users.noreply.github.com>
This commit is contained in:
IEL
2020-10-26 14:56:48 +00:00
parent c875a163e5
commit ccd5c2bc80
+4 -1
View File
@@ -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){