Python Decimal: Präzise Zahlenverarbeitung
In dieser Lektion über das Decimal-Modul in Python werden wir sehen, wie wir Dezimalzahlen in unseren Programmen für Präzision und Formatierung sowie für Berechnungen verwalten können. Die Präzision bei Dezimalzahlen geht sehr leicht verloren, wenn die Zahlen nicht korrekt behandelt werden. Sehen wir uns an, wie das Decimal-Modul und seine verfügbaren Funktionen in diesen Bereichen helfen.
Arbeiten mit Dezimalzahlen
Dezimalzahlen sind einfach die Fließkommazahlen mit festen Dezimalpunkten. Wir müssen die Zahlen korrekt runden, basierend auf unserem Bedarf, sonst können die Ergebnisse unerwartet sein. Pythons Decimal-Modul hilft uns, präziser mit Dezimalzahlen umzugehen.
Notwendigkeit des Decimal-Moduls
Bevor wir dieses Modul tatsächlich verwenden, sehen wir uns an, über welche Präzision wir sprechen und warum wir dieses Modul tatsächlich benötigen. Schauen wir uns den folgenden Code-Snippet an:
division = 72 / 7
print(division)
Lassen Sie uns das Output für dieses Programm sehen:
sh-3.2$ python decimal_module_need.py
10
Verwendung des Decimal-Moduls
In allen Programmen, die wir in diesem Beitrag erstellen, werden wir das Decimal-Modul importieren:
import decimal
Es kann sein, dass wir nur eine spezifische Funktion aus diesem Modul importieren. Dies kann folgendermaßen gemacht werden:
from decimal import Decimal
Beginnen wir damit, das Decimal-Modul in einigen Programmen einzusetzen.
Python Decimal Modul Beispiel
Wir beginnen jetzt mit Beispielen, die sich auf das Modul beziehen.
Korrektur der Division mit Dezimalzahlen
Hier werden wir das oben geschriebene Programm korrigieren, um eine Division durchzuführen, die eigentlich ein Fließkommazahl-Ergebnis produzieren sollte. Das modifizierte Programm mit dem Decimal-Modul wird wie folgt aussehen:
import decimal
division = decimal.Decimal(72) / decimal.Decimal(7)
print(division)
Lassen Sie uns das Output für dieses Programm sehen:
sh-3.2$ python python_correct_decimal_division.py
10.28571328571428571428571429
sh-3.2$
Zu beachten, die Division ist jetzt korrekt und präzise, oder vielleicht ist sie zu präzise?
Präzisionskontrolle für eine einzelne Operation
Im letzten Programm gab es jetzt 25 Dezimalstellen im Ergebnis. Aber was, wenn wir nur bis zu drei Dezimalstellen wollten? Dies kann ebenfalls gesteuert werden. Hier werden wir die Präzision der Antwort steuern, die sich nicht auf andere Operationen in unserem Programm auswirken wird:
import decimal
with decimal.localcontext() as ctx:
ctx.prec = 3
division = decimal.Decimal(72) / decimal.Decimal(7)
print(division)
again = decimal.Decimal(72) / decimal.Decimal(7)
print(again)
Wir haben die Divisionsoperation zweimal durchgeführt, um einen Punkt zu beweisen. Lassen Sie uns das Output für dieses Programm sehen:
sh-3.2$ python_decimal_division_precision.py
10.3
10.28571328571428571428571429
sh-3.2$
Haben Sie etwas bemerkt? Die von uns eingestellte Präzision war nur einmalig gültig. Beim nächsten Mal, als wir die Division durchführten, erhielten wir dasselbe Ergebnis zurück.
Präzisionskontrolle für das komplette Programm
Es ist auch möglich, die Präzision im gesamten Programm global zu steuern. Dies wird nicht immer empfohlen, wenn Sie in Ihrem Programm mit vielen Zahlen arbeiten. Hier ist ein Beispiel:
import decimal
decimal.getcontext().prec = 3
division = decimal.Decimal(72) / decimal.Decimal(7)
print(division)
again = decimal.Decimal(72) / decimal.Decimal(7)
print(again)
Lassen Sie uns das Output für dieses Programm sehen:
sh-3.2$ python_decimal_division_precision_global.py
10.3
10.3
sh-3.2$
Runden der Zahlen
Es ist möglich, die Zahlen mit der Funktion round(…) elegant zu runden. Lassen Sie uns das ausprobieren:
import decimal
#Can be rounded to 13.48 or 13.49
rounded = round(13.485, 2)
print(rounded)
Lassen Sie uns das Output für dieses Programm sehen:
sh-3.2$ python_round.py
13.48
sh-3.2$
Die Zahl im Programm kann auf 13.48 oder 13.49 gerundet werden. Standardmäßig rundet die Funktion round(…) ab. Dies kann jedoch geändert werden:
import decimal
#Can be rounded to 13.48 or 13.49
rounded = round(13.485, 2)
print(decimal.Decimal(rounded).quantize(decimal.Decimal('0.00'), rounding=decimal.ROUND_UP))
Lassen Sie uns das Output für dieses Programm sehen:
sh-3.2$ python_round_up.py
13.49
sh-3.2$
Python Decimal Kontext erhalten
Wenn Sie daran interessiert sind, den Standardkontext anzusehen, der standardmäßig für das Decimal-Modul festgelegt ist, können Sie das folgende Skript verwenden:
from decimal import *
print(getcontext())
Lassen Sie uns das Output für dieses Programm sehen:
sh-3.2$ python python_decimal_context.py
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999, ca
pitals=1, flags=[], traps=[DivisionByZero, Overflow, InvalidOperation])
sh-3.2$
Fazit
Das ist alles für das Python-Decimal-Modul, es ist sehr nützlich, wenn man mit Fließkommazahlen arbeitet. Python Decimal: Präzise Zahlenverarbeitung