From d53b2b94b9cce3f1a2039f924ef4c181e9d8640f Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Bellet Date: Tue, 9 Aug 2022 16:23:45 +0200 Subject: [PATCH] When creating new product via `/admin/products/new` use BigDecimal to avoid bad rounded multiplication example here: 700*0.001 = 0.7000000000000001 + update specs as well --- .../products/controllers/units_controller.js.coffee | 2 +- .../admin/products/units_controller_spec.js.coffee | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/admin/products/controllers/units_controller.js.coffee b/app/assets/javascripts/admin/products/controllers/units_controller.js.coffee index 7e9cdedb60..3e1e601b31 100644 --- a/app/assets/javascripts/admin/products/controllers/units_controller.js.coffee +++ b/app/assets/javascripts/admin/products/controllers/units_controller.js.coffee @@ -32,7 +32,7 @@ angular.module("admin.products") if match $scope.product.master.unit_value = PriceParser.parse(match[1]) $scope.product.master.unit_value = null if isNaN($scope.product.master.unit_value) - $scope.product.master.unit_value *= $scope.product.variant_unit_scale if $scope.product.master.unit_value && $scope.product.variant_unit_scale + $scope.product.master.unit_value = window.bigDecimal.multiply($scope.product.master.unit_value, $scope.product.variant_unit_scale, 2) if $scope.product.master.unit_value && $scope.product.variant_unit_scale $scope.product.master.unit_description = match[3] else value = $scope.product.master.unit_value diff --git a/spec/javascripts/unit/admin/products/units_controller_spec.js.coffee b/spec/javascripts/unit/admin/products/units_controller_spec.js.coffee index 72046716cc..b0e7908b02 100644 --- a/spec/javascripts/unit/admin/products/units_controller_spec.js.coffee +++ b/spec/javascripts/unit/admin/products/units_controller_spec.js.coffee @@ -17,7 +17,8 @@ describe "unitsCtrl", -> inject ($rootScope, $controller, VariantUnitManager) -> scope = $rootScope ctrl = $controller 'unitsCtrl', {$scope: scope, VariantUnitManager: VariantUnitManager} - + window.bigDecimal = jasmine.createSpyObj "bigDecimal", ["multiply"] + window.bigDecimal.multiply.and.callFake (a, b, c) -> a * b describe "interpretting variant_unit_with_scale", -> it "splits string with one underscore and stores the two parts", -> @@ -93,3 +94,11 @@ describe "unitsCtrl", -> scope.processUnitValueWithDescription() expect(scope.product.master.unit_value).toEqual 22.22 expect(scope.product.master.unit_description).toEqual "things" + + it "handles nice rounded division", -> + # this is a bit absurd, but it assure use that bigDecimal is called + window.bigDecimal.multiply.and.returnValue 0.7 + scope.product.master.unit_value_with_description = "700" + scope.product.variant_unit_scale = 0.001 + scope.processUnitValueWithDescription() + expect(scope.product.master.unit_value).toEqual 0.7