veröffentlicht am: 25.10.2022 zuletzt aktualisiert am: 01.02.2023
Oft ist es einfacher, mit kürzeren Zahlen zu rechnen, als mit endlos langen wie π/Pi. Für das Runden von Zahlen oder auch eigenen Klassen stellt Python viele Möglichkeiten bereit, von denen ich dir im Folgenden ein paar vorstellen möchte.
Mit der Funktion int(Zahl) kannst du nur den Typ der Variablen ändern, Dezimalstellen werden dabei komplett abgeschnitten.
zahl = 7.895 print(zahl) print(int(zahl))
Output
7.895 7
Um eine Zahl wirklich zu Runden, stehen uns die hier dargestellten Methoden zur Verfügung.
Am einfachsten kannst du Zahlen in Python runden, indem du die eingebaute Funktion round verwendest.
round(Zahl, Dezimalstellen) Zahl (Erforderlich) Die Zahl, die gerundet werden soll. Dezimalstellen (Optional) Anzahl der Dezimalstellen welche zum Runden genutzt werden sollen. Standart ist 0
So können wir zum Beispiel das in der Einleitung erwähnte π/Pi in Python aufrunden.
from math import pi print(round(pi, 2), f"= round({pi}, 2)") print(round(pi, 3), f"= round({pi}, 3)") print(round(pi, 10), f"= round({pi}, 10)")
Output:
3.14 = round(3.141592653589793, 2) 3.142 = round(3.141592653589793, 3) 3.1415926536 = round(3.141592653589793, 10)
Im vorigen Beispiel scheint nichts auffällig anders zu sein und wie du siehst können wir in Python Nachkommastellen abschneiden (in unserem Beispiel auch das Python runden auf 2 Nachkommastellen), jedoch im Nächsten könnten die Ergebnisse vielleicht etwas unerwartet ausfallen.
zahlen = [2.695, 2.685, 2.675, 2.665, 2.655, 2.645, 2.635, 2.625, 2.615, 2.605] for zahl in zahlen: print(round(zahl, 2), f"= round({zahl}, 2)")
2.69 = round(2.695, 2) 2.69 = round(2.685, 2) 2.67 = round(2.675, 2) 2.67 = round(2.665, 2) 2.65 = round(2.655, 2) 2.65 = round(2.645, 2) 2.63 = round(2.635, 2) 2.62 = round(2.625, 2) 2.62 = round(2.615, 2) 2.6 = round(2.605, 2)
Hier fällt auf, dass fast alle Ergebnisse auf einer ungeraden Zahl enden, bis auf die letzten Drei, wobei es sich nicht etwa um einen Fehler handelt, sondern um die Implementierte Methode für das “Banker’s rounding” in Python 3 (siehe auch https://bugs.python.org/issue36082).
Das Modul math verfügt über einige praktische Funktionen, von denen ich ceil und floor kurz vorstelle.
import math math.ceil(3.141592653589793) # 4 math.ceil(2.605) # 3 math.ceil(2.665) # 3 math.ceil(2.3333333) # 3
Mit math.ceil lässt sich der nächsthöhere ganzzahlige Wert einer Zahl ermitteln (Python aufrunden) , mit math.floor lässt sich der abgerundete Wert ebenso einfach errechnen.
math.floor(3.141592653589793) # 3 math.floor(2.605) # 2 math.floor(2.665) # 2 math.floor(2.3333333) # 2
Du kannst, um round für deine eigenen Klassen zu unterstützen, die magic method __round__ implementieren, wie hier veranschaulicht:
class Data(object): def __init__(self, zahl): self.zahl = zahl def __round__(self, dezimalstellenanzahl): return round(self.zahl, dezimalstellenanzahl) zahlen = [2.695, 2.685, 2.675, 2.665, 2.655, 2.645, 2.635, 2.625, 2.615, 2.605] for zahl in zahlen: d = Data(zahl) print(round(d, 2))
2.69 2.69 2.67 2.67 2.65 2.65 2.63 2.62 2.62 2.6
Wenn du möchtest, kannst du an dieser Stelle auch deinen eigenen Rundungsalgorithmus implementieren. Und das geht dann mit “Round half up”.
import math zahlen = [2.696, 2.695, 2.694, 2.685, 2.675, 2.665, 2.655, 2.645, 2.635, 2.625, 2.615, 2.605] class Data(object): def __init__(self, i): self.zahl = i def __round__(self, dezimalstellen): # round_half_up multiplikator = 10 ** dezimalstellen return math.floor(self.zahl * multiplikator + 0.5) / multiplikator for zahl in zahlen: d = Data(zahl) print(round(d, 2), f"= round({d.zahl}, 2)")
2.7 = round(2.696, 2) 2.7 = round(2.695, 2) 2.69 = round(2.694, 2) 2.69 = round(2.685, 2) 2.68 = round(2.675, 2) 2.67 = round(2.665, 2) 2.66 = round(2.655, 2) 2.65 = round(2.645, 2) 2.64 = round(2.635, 2) 2.63 = round(2.625, 2) 2.62 = round(2.615, 2) 2.61 = round(2.605, 2)
Decimal ist eine Klasse in Python, welche Gleitkommazahlen darstellen kann und eine hohe Rechengenauigkeit erlaubt.
Durch die Implementierung von float kann es unter Umständen zu Rechenungenauigkeiten kommen, wie man diese umgehen kann mittels Konvertierung in string zeigt das folgende Beispiel.(siehe auch Blogpost int zu string, Sektion eigene Klasse mit __str__()-Unterstützung)
from decimal import Decimal zahlen = [2.696, 2.695, 2.694, 2.685, 2.675, 2.665, 2.655, 2.645, 2.635, 2.625, 2.615, 2.605] for zahl in zahlen: d = Decimal(zahl) print(d, "float") d = Decimal(str(zahl)) print(d, "string")
2.696000000000000174082970261224545538425445556640625 float 2.696 string 2.694999999999999840127884453977458178997039794921875 float 2.695 string 2.69399999999999995026200849679298698902130126953125 float 2.694 string 2.685000000000000053290705182007513940334320068359375 float 2.685 string 2.67499999999999982236431605997495353221893310546875 float 2.675 string 2.66500000000000003552713678800500929355621337890625 float 2.665 string 2.654999999999999804600747665972448885440826416015625 float 2.655 string 2.645000000000000017763568394002504646778106689453125 float 2.645 string 2.6349999999999997868371792719699442386627197265625 float 2.635 string 2.625 float 2.625 string 2.6150000000000002131628207280300557613372802734375 float 2.615 string 2.604999999999999982236431605997495353221893310546875 float 2.605 string
Der gleiche Effekt wie in unserer selbst erstellten Klasse kann auch mit einigen der Rundungsmethoden von Decimal erzielt werden.
Das Modul decimal stellt folgende Rundungsmethoden zur Verfügung:ROUND_05UPROUND_DOWNROUND_HALF_DOWNROUND_UPROUND_HALF_UPROUND_CEILINGROUND_FLOORROUND_HALF_EVEN
Wie man diese verschiedenen Varianten zu runden nun auf Zahlen anwendet, zeigt das folgende Beispiel, wobei der Output manuell von mir in einer Tabelle strukturiert wurde um eine bessere Übersicht über die Ergebnisse zu gewährleisten.
from decimal import Decimal, ROUND_05UP, ROUND_DOWN, ROUND_HALF_DOWN, ROUND_UP, ROUND_HALF_UP, ROUND_CEILING, ROUND_FLOOR, ROUND_HALF_EVEN zahlen = [2.696, 2.695, 2.694, 2.685, 2.625, 2.615, 2.605] for zahl in zahlen: d = Decimal(str(zahl)) print(d) print(d.quantize(Decimal('1.00'), rounding=ROUND_05UP), "ROUND_05UP") print(d.quantize(Decimal('1.00'), rounding=ROUND_DOWN), "ROUND_DOWN") print(d.quantize(Decimal('1.00'), rounding=ROUND_HALF_DOWN), "ROUND_HALF_DOWN") print(d.quantize(Decimal('1.00'), rounding=ROUND_UP), "ROUND_UP") print(d.quantize(Decimal('1.00'), rounding=ROUND_HALF_UP), "ROUND_HALF_UP") print(d.quantize(Decimal('1.00'), rounding=ROUND_CEILING), "ROUND_CEILING") print(d.quantize(Decimal('1.00'), rounding=ROUND_FLOOR), "ROUND_FLOOR") print(d.quantize(Decimal('1.00'), rounding=ROUND_HALF_EVEN), "ROUND_HALF_EVEN")
Das Runden mit der eingebauten Python round Funktion scheint bei erster Betrachtung etwas merkwürdig, jedoch können mit dem Datentypen Decimal noch weitere Rundungsmethoden verwendet werden. Ebenso kannst du mit der magic method __round__ einfach selbst ein Verhalten für deine Objekte festlegen, wenn round auf sie angewendet wird und auch in Python Nachkommastellen abschneiden.
Hat dir dieser Beitrag gefallen? Hast du noch Fragen? Bitte schreibe es in die Kommentare!
😩 Gelangweilt von den Udemy & YouTube-Tutorials?!
Lerne spielerisch Python und komme deiner gutbezahlten (und an der 🌴 liegenden) Traumkarriere einen Schritt weiter.
"Für Leute die gerne Python oder Java lernen wollen ist Codegree klasse. Ist nicht wie bei anderen Konkurrenten auf Videokursen aufgebaut..."
- Lennart Sparbier
100% kostenlos registrieren · keine Kreditkarte notwendig
Im Gegensatz zu der Abendschule oder der alteingesessenen Uni lernst du bei codegree die Sprachen & Pakete, die wirklich im Jobmarkt gesucht werden.
100% kostenlos registrieren · keine Zahlungsdaten notwendig