Merge pull request #9497 from jibees/9493-fix-issues-around-rounding-in-imperial-metric-system

Avoid floating rounded errors when using imperial or metric system
This commit is contained in:
jibees
2022-09-08 16:34:12 +02:00
committed by GitHub
7 changed files with 1234 additions and 48 deletions

View File

@@ -105,6 +105,8 @@
//= require moment/locale/tr.js
//= require moment/locale/pl.js
//= require js-big-decimal/dist/web/js-big-decimal.min.js
// foundation
//= require ../shared/mm-foundation-tpls-0.9.0-20180826174721.min.js

View File

@@ -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

View File

@@ -23,10 +23,10 @@ angular.module("admin.products").controller "variantUnitsCtrl", ($scope, Variant
$scope.updateValue = ->
unit_value_human = angular.element('#unit_value_human').val()
$scope.unit_value = PriceParser.parse(unit_value_human) * $scope.scale
$scope.unit_value = bigDecimal.multiply(PriceParser.parse(unit_value_human), $scope.scale, 2)
variant_unit_value = angular.element('#variant_unit_value').val()
$scope.unit_value_human = variant_unit_value / $scope.scale
$scope.unit_value_human = parseFloat(bigDecimal.divide(variant_unit_value, $scope.scale, 2))
$timeout -> $scope.processUnitPrice()
$timeout -> $scope.updateValue()

View File

@@ -56,7 +56,7 @@ module VariantUnits
def option_value_value_unit_scaled
unit_scale, unit_name = scale_for_unit_value
value = @variant.unit_value / unit_scale
value = BigDecimal(@variant.unit_value / unit_scale, 6)
[value, unit_name]
end

View File

@@ -44,6 +44,7 @@
"flatpickr": "^4.6.9",
"foundation-sites": "^5.5.2",
"jquery-ui": "1.13.0",
"js-big-decimal": "^1.3.5",
"moment": "^2.29.1",
"mrujs": "^0.7.4",
"select2": "^4.0.13",

View File

@@ -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

1260
yarn.lock

File diff suppressed because it is too large Load Diff