From 91af282ccc70d9289a98753a7541a6b6b321afb2 Mon Sep 17 00:00:00 2001 From: Gaetan Craig-Riou Date: Wed, 11 Jan 2023 10:49:27 +1100 Subject: [PATCH 1/2] Truncate scaled value unit to maximum of two decimals ie truncate 12.50001234 to 12.5 When using imperial, the scalling calculation rounding results in value unit having extra decimal when converted back to imperial + related spec --- app/services/variant_units/option_value_namer.rb | 2 +- spec/services/variant_units/option_value_namer_spec.rb | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/app/services/variant_units/option_value_namer.rb b/app/services/variant_units/option_value_namer.rb index 155fb33a4d..66e50833ba 100644 --- a/app/services/variant_units/option_value_namer.rb +++ b/app/services/variant_units/option_value_namer.rb @@ -56,7 +56,7 @@ module VariantUnits def option_value_value_unit_scaled unit_scale, unit_name = scale_for_unit_value - value = BigDecimal(@variant.unit_value / unit_scale, 6) + value = BigDecimal(@variant.unit_value / unit_scale, 6).truncate(2) [value, unit_name] end diff --git a/spec/services/variant_units/option_value_namer_spec.rb b/spec/services/variant_units/option_value_namer_spec.rb index da3124c19c..936edbbfb6 100644 --- a/spec/services/variant_units/option_value_namer_spec.rb +++ b/spec/services/variant_units/option_value_namer_spec.rb @@ -145,6 +145,15 @@ module VariantUnits allow(v).to receive(:unit_value) { nil } expect(subject.send(:option_value_value_unit)).to eq [nil, nil] end + + it "truncates value to 2 decimals maximum" do + oz_scale = 28.35 + p = double(:product, variant_unit: 'weight', variant_unit_scale: oz_scale) + allow(v).to receive(:product) { p } + # The unit_value is stored rounded to 2 decimals + allow(v).to receive(:unit_value) { (12.5 * oz_scale).round(2) } + expect(subject.send(:option_value_value_unit)).to eq [BigDecimal(12.5, 6), 'oz'] + end end end end From 6e76bcac4a9f86035b6c95a341bd3d25ad9516b2 Mon Sep 17 00:00:00 2001 From: Gaetan Craig-Riou Date: Wed, 11 Jan 2023 15:35:30 +1100 Subject: [PATCH 2/2] Refactor option_value_value_unit_scaled to use to_d instead of calling BigDecimal As we are now using truncate(2) we don't need to specify the number of significant digits --- app/services/variant_units/option_value_namer.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/variant_units/option_value_namer.rb b/app/services/variant_units/option_value_namer.rb index 66e50833ba..085a73b256 100644 --- a/app/services/variant_units/option_value_namer.rb +++ b/app/services/variant_units/option_value_namer.rb @@ -56,7 +56,7 @@ module VariantUnits def option_value_value_unit_scaled unit_scale, unit_name = scale_for_unit_value - value = BigDecimal(@variant.unit_value / unit_scale, 6).truncate(2) + value = (@variant.unit_value / unit_scale).to_d.truncate(2) [value, unit_name] end