Il modo più diretto per prendere il soffitto di un'istanza decimale x
è quello di utilizzare x.to_integral_exact(rounding=ROUND_CEILING)
. Non c'è bisogno di pasticciare con il contesto qui. Si noti che questo imposta i flag Inexact
e Rounded
laddove appropriato; se non vuoi che le bandiere vengano toccate, usa invece x.to_integral_value(rounding=ROUND_CEILING)
. Esempio:
>>> from decimal import Decimal, ROUND_CEILING
>>> x = Decimal('-123.456')
>>> x.to_integral_exact(rounding=ROUND_CEILING)
Decimal('-123')
differenza della maggior parte dei metodi decimali, i to_integral_exact
e to_integral_value
metodi non sono influenzati dalla precisione del contesto attuale, in modo da non dover preoccuparsi di cambiare la precisione:
>>> from decimal import getcontext
>>> getcontext().prec = 2
>>> x.to_integral_exact(rounding=ROUND_CEILING)
Decimal('-123')
A proposito, in Python 3.x, math.ceil
funziona esattamente come si desidera, tranne che restituisce un'istanza int
anziché un'istanza Decimal
. Funziona perché math.ceil
è sovraccarico per i tipi personalizzati in Python 3. In Python 2,converte semplicemente l'istanza Decimal
in un float
per prima, potenzialmente perdendo le informazioni nel processo, così puoi finire con risultati errati.
fonte
2010-05-09 09:58:07
Sono nuovo di Python, appena iniziato ieri infatti. Mi sono imbattuto in questo problema nel mio secondo programma di pratica (il primo era ovviamente la "stampa" obbligatoria Hello, World! ";"). quindi, sto trovando difficile giudicare la migliore risposta a questo. La soluzione decimale.Context di Matthew Flaschen ha funzionato nel mio caso particolare. Ma mi piacerebbe che gli altri volessero cambiare la soluzione migliore (sarebbe utile anche per i neofiti come me se riesci a spiegare perché un certo approccio funziona meglio) e tornerò ad accettare. – Gunjan