61

Decimals の長いリストがあり、特定の条件に応じて 10、100、1000、..... 1000000 の係数で調整する必要があります。それらを乗算すると、(常にではありませんが)削除したい無駄な末尾のゼロが時々あります。例えば...

from decimal import Decimal

# outputs 25.0,  PROBLEM!  I would like it to output 25
print Decimal('2.5') * 10

# outputs 2567.8000, PROBLEM!  I would like it to output 2567.8
print Decimal('2.5678') * 1000

これらの意味のないゼロを削除するように decimal オブジェクトに指示する関数はありますか? これを行う唯一の方法は、文字列に変換し、正規表現を使用してそれらを置き換えることです。

おそらく、私はpython 2.6.5を使用していることに言及する必要があります

編集センダールの素晴らしい答えにより、正規化すると2.5E + 2を生成する250.0のような数値が時々得られることに気付きました。これらの場合、それらを整理してintに変換しようとすることができると思います

4

11 に答える 11

119

メソッドを使用しnormalizeて、余分な精度を削除できます。

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

小数点の左側のゼロを削除しないようにするには、次のようにします。

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

または、よりコンパクトに、user7116quantizeの提案に従って使用します。

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

ここto_integral()に示すように使用することもできますが、この方法を使用する方がより自己文書化できると思います。as_tuple

これらの両方をいくつかのケースに対してテストしました。機能しないものを見つけた場合は、コメントを残してください。

>>> 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')
于 2012-06-27T13:48:03.073 に答える
48

これを行うにはおそらくより良い方法がありますが、.rstrip('0').rstrip('.')希望する結果を達成するために使用できます。

例としてあなたの番号を使用して:

>>> s = str(Decimal('2.5') * 10)
>>> print s.rstrip('0').rstrip('.') if '.' in s else s
25
>>> s = str(Decimal('2.5678') * 1000)
>>> print s.rstrip('0').rstrip('.') if '.' in s else s
2567.8

そして、これがgerritがコメントで指摘した問題の修正です:

>>> s = str(Decimal('1500'))
>>> print s.rstrip('0').rstrip('.') if '.' in s else s
1500
于 2012-06-27T13:54:51.040 に答える
44

ドキュメントのFAQからDecimal回答:

>>> def remove_exponent(d):
...     return d.quantize(Decimal(1)) if d == d.to_integral() else d.normalize()

>>> remove_exponent(Decimal('5.00'))
Decimal('5')

>>> remove_exponent(Decimal('5.500'))
Decimal('5.5')

>>> remove_exponent(Decimal('5E+3'))
Decimal('5000')
于 2013-09-12T16:04:16.920 に答える
1

私はこれをやってしまった:

import decimal

def dropzeros(number):
    mynum = decimal.Decimal(number).normalize()
    # e.g 22000 --> Decimal('2.2E+4')
    return mynum.__trunc__() if not mynum % 1 else float(mynum)

print dropzeros(22000.000)
22000
print dropzeros(2567.8000)
2567.8

注: 戻り値を文字列としてキャストすると、有効桁数が 12 桁に制限されます

于 2014-05-04T21:50:43.850 に答える
0

これはうまくいくはずです:

'{:f}'.format(decimal.Decimal('2.5') * 10).rstrip('0').rstrip('.')
于 2013-08-18T12:08:20.827 に答える