13

Pythonで高精度Decimalのceilを取得する方法はありますか?

>>> import decimal;
>>> decimal.Decimal(800000000000000000001)/100000000000000000000
Decimal('8.00000000000000000001')
>>> math.ceil(decimal.Decimal(800000000000000000001)/100000000000000000000)
8.0

数学は値を丸め、正確でない値を返します

4

6 に答える 6

30

Decimal インスタンスの上限を取得する最も直接的な方法xは、 を使用することx.to_integral_exact(rounding=ROUND_CEILING)です。ここで文脈をいじる必要はありません。Inexactこれにより、必要に応じてフラグとRoundedフラグが設定されることに注意してください。フラグに触れたくない場合は、x.to_integral_value(rounding=ROUND_CEILING)代わりに使用してください。例:

>>> from decimal import Decimal, ROUND_CEILING
>>> x = Decimal('-123.456')
>>> x.to_integral_exact(rounding=ROUND_CEILING)
Decimal('-123')

ほとんどの Decimal メソッドとは異なり、メソッドto_integral_exactto_integral_valueメソッドは現在のコンテキストの精度の影響を受けないため、精度の変更について心配する必要はありません。

>>> from decimal import getcontext
>>> getcontext().prec = 2
>>> x.to_integral_exact(rounding=ROUND_CEILING)
Decimal('-123')

ちなみに、Python 3.x では、インスタンスではなく をmath.ceil返すことを除いて、希望どおりに動作します。これは、Python 3 のカスタム型に対してオーバーロード可能であるため機能します。Python 2 では、インスタンスを最初の型に変換するだけで、プロセスで情報が失われる可能性があるため、誤った結果になる可能性があります。intDecimalmath.ceilmath.ceilDecimalfloat

于 2010-05-09T09:58:07.413 に答える
6
x = decimal.Decimal('8.00000000000000000000001')
with decimal.localcontext() as ctx:
    ctx.prec=100000000000000000
    ctx.rounding=decimal.ROUND_CEILING
    y = x.to_integral_exact()
于 2010-05-08T23:14:25.643 に答える
4

これは、Context コンストラクターの精度と丸めモード オプションを使用して行うことができます。

ctx = decimal.Context(prec=1, rounding=decimal.ROUND_CEILING)
ctx.divide(decimal.Decimal(800000000000000000001), decimal.Decimal(100000000000000000000))

編集:受け入れられた回答を変更することを検討する必要があります.prec必要に応じて増やすことができますto_integral_exactが、より簡単な解決策です。

于 2010-05-08T22:56:43.760 に答える
0

これを行うには、効力を使用するだけです。インポート数学

def lo_ceil(num, potency=0): # Use 0 for multiples of 1, 1 for multiples of 10, 2 for 100 ...
      n = num / (10.0 ** potency)
      c = math.ceil(n)
      return c * (10.0 ** potency)

lo_ceil(8.0000001, 1) # return 10
于 2013-01-22T22:07:06.307 に答える
0
>>> decimal.Context(rounding=decimal.ROUND_CEILING).quantize(
...   decimal.Decimal(800000000000000000001)/100000000000000000000, 0)
Decimal('9')
于 2010-05-08T22:59:41.420 に答える
0
def decimal_ceil(x):
    int_x = int(x)
    if x - int_x == 0:
        return int_x
    return int_x + 1
于 2010-05-08T23:00:25.460 に答える