La forma más directa para tomar el techo de una instancia decimal x
es utilizar x.to_integral_exact(rounding=ROUND_CEILING)
. No hay necesidad de meterse con el contexto aquí. Tenga en cuenta que esto establece los indicadores Inexact
y Rounded
donde corresponda; si no quiere que se toquen las banderas, use x.to_integral_value(rounding=ROUND_CEILING)
en su lugar. Ejemplo:
>>> from decimal import Decimal, ROUND_CEILING
>>> x = Decimal('-123.456')
>>> x.to_integral_exact(rounding=ROUND_CEILING)
Decimal('-123')
A diferencia de la mayoría de los métodos de decimales, los métodos y to_integral_exact
to_integral_value
no se ven afectados por la precisión del contexto actual, por lo que no tiene que preocuparse de cambiar la precisión:
>>> from decimal import getcontext
>>> getcontext().prec = 2
>>> x.to_integral_exact(rounding=ROUND_CEILING)
Decimal('-123')
Por cierto, en Python 3.x, math.ceil
funciona exactamente como lo desea, excepto que devuelve una instancia de int
en lugar de Decimal
. Eso funciona porque math.ceil
es sobrecargable para tipos personalizados en Python 3. En Python 2, math.ceil
simplemente convierte la instancia Decimal
en un float
primero, lo que podría perder información en el proceso, por lo que puede terminar con resultados incorrectos.
Soy nuevo en python, recién empecé ayer. Tropecé con este problema en mi segundo programa de práctica (el primero era, por supuesto, el obligatorio "imprimir" Hello, World! '; "). entonces, me resulta difícil juzgar la mejor respuesta a esto. La solución decimal.Context de Matthew Flaschen funcionó en mi caso particular. Pero me gustaría que los demás voten mejor que la mejor solución (también sería útil para los novatos como yo si puedes explicar por qué un cierto enfoque funciona mejor) y volveré y acepto. – Gunjan