drop trailing zeros from decimal

前端 未结 9 1893
庸人自扰
庸人自扰 2020-11-29 03:54

I have a long list of Decimals and that I have to adjust by factors of 10, 100, 1000,..... 1000000 depending on certain conditions. When I multiply them there is sometimes

9条回答
  •  [愿得一人]
    2020-11-29 04:34

    You can use the normalize method to remove extra precision.

    >>> print decimal.Decimal('5.500')
    5.500
    >>> print decimal.Decimal('5.500').normalize()
    5.5
    

    To avoid stripping zeros to the left of the decimal point, you could do this:

    def normalize_fraction(d):
        normalized = d.normalize()
        sign, digits, exponent = normalized.as_tuple()
        if exponent > 0:
            return decimal.Decimal((sign, digits + (0,) * exponent, 0))
        else:
            return normalized
    

    Or more compactly, using quantize as suggested by user7116:

    def normalize_fraction(d):
        normalized = d.normalize()
        sign, digit, exponent = normalized.as_tuple()
        return normalized if exponent <= 0 else normalized.quantize(1)
    

    You could also use to_integral() as shown here but I think using as_tuple this way is more self-documenting.

    I tested these both against a few cases; please leave a comment if you find something that doesn't work.

    >>> normalize_fraction(decimal.Decimal('55.5'))
    Decimal('55.5')
    >>> normalize_fraction(decimal.Decimal('55.500'))
    Decimal('55.5')
    >>> normalize_fraction(decimal.Decimal('55500'))
    Decimal('55500')
    >>> normalize_fraction(decimal.Decimal('555E2'))
    Decimal('55500')
    

提交回复
热议问题