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:

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

Kostenlosen Account erstellen

Registrieren Sie sich jetzt und erhalten Sie Zugang zu unseren Cloud Produkten.

Das könnte Sie auch interessieren: