Der direkteste Weg, um die Decke einer Dezimal-Instanz nehmen x
ist x.to_integral_exact(rounding=ROUND_CEILING)
zu verwenden. Es gibt keine Notwendigkeit, sich hier mit dem Kontext zu befassen. Beachten Sie, dass dabei die Flags Inexact
und Rounded
gegebenenfalls gesetzt werden. Wenn Sie nicht möchten, dass die Markierungen berührt werden, verwenden Sie stattdessen x.to_integral_value(rounding=ROUND_CEILING)
. Beispiel:
>>> from decimal import Decimal, ROUND_CEILING
>>> x = Decimal('-123.456')
>>> x.to_integral_exact(rounding=ROUND_CEILING)
Decimal('-123')
Im Gegensatz zu den meisten der Dezimal-Methoden, die to_integral_exact
und to_integral_value
Methoden werden nicht durch die Genauigkeit des aktuellen Kontext beeinflusst, so dass Sie nicht über das Ändern Präzision kümmern:
>>> from decimal import getcontext
>>> getcontext().prec = 2
>>> x.to_integral_exact(rounding=ROUND_CEILING)
Decimal('-123')
By the way, in Python 3.x math.ceil
funktioniert genau so, wie Sie es wollen, mit der Ausnahme, dass es eine int
eher als eine Decimal
Instanz zurückgibt. Das funktioniert, weil math.ceil
für benutzerdefinierte Typen in Python 3 überladbar ist. In Python 2 konvertiert math.ceil
einfach die Decimal
Instanz in eine float
zuerst, möglicherweise Informationen im Prozess zu verlieren, so dass Sie mit falschen Ergebnissen enden können.
Ich bin neu in Python, erst gestern begann in der Tat. Stolperte über dieses Problem in meinem zweiten Übungsprogramm (das erste war natürlich das obligatorische "Drucken Hallo, Welt!";). Daher fällt es mir schwer, die beste Antwort darauf zu beurteilen. Die decimal.Context Lösung von Matthew Flaschen hat in meinem speziellen Fall funktioniert. Aber ich würde gerne andere die beste Lösung upvote (auch für Neulinge wie mich hilfreich wäre, wenn Sie erklären können, warum ein bestimmter Ansatz funktioniert besser) und ich werde zurückkommen und akzeptieren. – Gunjan