Skip to content

Issues with 'percent' units #2205

@daniel-fink

Description

@daniel-fink

I'm not sure why this occurs, but:

foo = pint.Quantity(20, "%") * pint.Quantity(5, "%") / pint.Quantity(1, "%")
foo
<Quantity(100.0, 'percent')>

Is not the same as:

foo = 20 * ureg.percent * 5 * ureg.percent / 1 * ureg.percent
foo
<Quantity(100.0, 'percent ** 3')>

In addition, .to_reduced_units() scales and reduces to 'dimensionless' when not combining with other units:

ratio = 20 * ureg.percent * 5
ratio
<Quantity(100, 'percent')>

ratio.to_reduced_units()
<Quantity(1.0, 'dimensionless')>

But when combining they don't 'scale' or reduce to dimensionless:

foo = ratio * 1 * ureg.meter
foo
<Quantity(100.0, 'percent * meter')>

foo.to_reduced_units()
<Quantity(100.0, 'percent * meter')>

Finally, if I define my own 'percent' units like: ureg.define("percent = 0.01 * dimensionless = % = pct")

I get errors on accessing the dimensionality of the result:

foo = 20 * ureg.percent * 5 * ureg.percent * 1 * ureg.meter
foo
<Quantity(100, 'percent ** 2 * meter')>

foo.dimensionality
Traceback (most recent call last):
  File "/Volumes/Data/Projects/Rangekeeper/src/.venv/lib/python3.10/site-packages/IPython/core/interactiveshell.py", line 3579, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-42-6e4a081873fb>", line 1, in <module>
    foo.dimensionality
  File "/Volumes/Data/Projects/Rangekeeper/src/.venv/lib/python3.10/site-packages/pint/facets/plain/quantity.py", line 354, in dimensionality
    self._dimensionality = self._REGISTRY._get_dimensionality(self._units)
  File "/Volumes/Data/Projects/Rangekeeper/src/.venv/lib/python3.10/site-packages/pint/facets/plain/registry.py", line 722, in _get_dimensionality
    self._get_dimensionality_recurse(input_units, 1, accumulator)
  File "/Volumes/Data/Projects/Rangekeeper/src/.venv/lib/python3.10/site-packages/pint/facets/plain/registry.py", line 754, in _get_dimensionality_recurse
    self._get_dimensionality_recurse(reg.reference, exp2, accumulator)
  File "/Volumes/Data/Projects/Rangekeeper/src/.venv/lib/python3.10/site-packages/pint/facets/plain/registry.py", line 752, in _get_dimensionality_recurse
    reg = self._units[self.get_name(key)]
  File "/Users/daniel/.pyenv/versions/3.10.15/lib/python3.10/collections/__init__.py", line 986, in __getitem__
    return self.__missing__(key)            # support subclasses that define __missing__
  File "/Users/daniel/.pyenv/versions/3.10.15/lib/python3.10/collections/__init__.py", line 978, in __missing__
    raise KeyError(key)
KeyError: ''

What would be the best way to have 'percent' units act as proper 1/100s of dimensionless units?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions