diff --git a/CHANGES b/CHANGES index f02717b08..dd4756aec 100644 --- a/CHANGES +++ b/CHANGES @@ -26,6 +26,7 @@ Pint Changelog - Add `pint.testing` with functions to compare pint objects in tests (Issue #1421). - Fix handling modulo & floordiv operator in pint_eval (Issue #1470) - Fix `to_compact` and `infer_base_unit` for non-float non_int_type. +- Fix `to_reduced_units` to work with dimensionless units. (Issue #919) - Fix parsing of units string with same canonalized name (Issue #1441 & #1142) ### Breaking Changes diff --git a/pint/registry.py b/pint/registry.py index 488189a2d..1b7be61bb 100644 --- a/pint/registry.py +++ b/pint/registry.py @@ -830,7 +830,9 @@ def _get_dimensionality_ratio(self, unit1, unit2): return 1 dim1, dim2 = (self.get_dimensionality(unit) for unit in (unit1, unit2)) - if not dim1 or not dim2 or dim1.keys() != dim2.keys(): # not comparable + if dim1 == dim2: + return 1 + elif not dim1 or not dim2 or dim1.keys() != dim2.keys(): # not comparable return None ratios = (dim2[key] / val for key, val in dim1.items()) diff --git a/pint/testsuite/test_quantity.py b/pint/testsuite/test_quantity.py index 28cf07596..cf43cdfe7 100644 --- a/pint/testsuite/test_quantity.py +++ b/pint/testsuite/test_quantity.py @@ -665,6 +665,13 @@ def test_to_reduced_units(self): q = self.Q_(0.5, "g*t/kg") helpers.assert_quantity_equal(q.to_reduced_units(), self.Q_(0.5, "kg")) + def test_to_reduced_units_dimensionless(self): + ureg = UnitRegistry(preprocessors=[lambda x: x.replace("%", " percent ")]) + ureg.define("percent = 0.01 count = %") + Q_ = ureg.Quantity + reduced_quantity = (Q_("1 s") * Q_("5 %") / Q_("1 count")).to_reduced_units() + assert reduced_quantity == ureg.Quantity(0.05, ureg.second) + @pytest.mark.parametrize( ("unit_str", "expected_unit"), [