fractions — Rationale Zahlen

Quellcode: Lib/fractions.py


Das Modul fractions bietet Unterstützung für die Arithmetik mit rationalen Zahlen.

Eine `Fraction`-Instanz kann aus einem Paar rationaler Zahlen, aus einer einzelnen Zahl oder aus einem String erstellt werden.

class fractions.Fraction(numerator=0, denominator=1)
class fractions.Fraction(number)
class fractions.Fraction(string)

Die erste Version erfordert, dass numerator und denominator Instanzen von numbers.Rational sind und gibt eine neue Fraction-Instanz mit dem Wert numerator/denominator zurück. Wenn denominator Null ist, wird ein ZeroDivisionError ausgelöst.

Die zweite Version erfordert, dass number eine Instanz von numbers.Rational ist oder die Methode as_integer_ratio() besitzt (dies schließt float und decimal.Decimal ein). Sie gibt eine Fraction-Instanz mit exakt demselben Wert zurück. Es wird angenommen, dass die Methode as_integer_ratio() ein Paar teilerfremder ganzer Zahlen zurückgibt und die letzte positiv ist. Beachten Sie, dass aufgrund der üblichen Probleme mit binären Punkten (siehe Gleitkomma-Arithmetik: Probleme und Einschränkungen), das Argument für Fraction(1.1) nicht exakt gleich 11/10 ist, und daher Fraction(1.1) nicht Fraction(11, 10) zurückgibt, wie man vielleicht erwarten würde. (Aber siehe die Dokumentation für die Methode limit_denominator() unten.)

Die letzte Version des Konstruktors erwartet einen String. Die übliche Form für diese Instanz ist

[sign] numerator ['/' denominator]

wobei das optionale sign entweder '+' oder '-' sein kann und numerator und denominator (falls vorhanden) Strings mit Dezimalziffern sind (Unterstriche dürfen zur Abgrenzung von Ziffern wie bei ganzzahligen Literalen in Code verwendet werden). Zusätzlich werden alle Strings, die einen endlichen Wert darstellen und vom float-Konstruktor akzeptiert werden, auch vom Fraction-Konstruktor akzeptiert. In beiden Formen kann der Eingabestring auch führende und/oder nachgestellte Leerzeichen enthalten. Hier sind einige Beispiele

>>> from fractions import Fraction
>>> Fraction(16, -10)
Fraction(-8, 5)
>>> Fraction(123)
Fraction(123, 1)
>>> Fraction()
Fraction(0, 1)
>>> Fraction('3/7')
Fraction(3, 7)
>>> Fraction(' -3/7 ')
Fraction(-3, 7)
>>> Fraction('1.414213 \t\n')
Fraction(1414213, 1000000)
>>> Fraction('-.125')
Fraction(-1, 8)
>>> Fraction('7e-6')
Fraction(7, 1000000)
>>> Fraction(2.25)
Fraction(9, 4)
>>> Fraction(1.1)
Fraction(2476979795053773, 2251799813685248)
>>> from decimal import Decimal
>>> Fraction(Decimal('1.1'))
Fraction(11, 10)

Die Klasse Fraction erbt von der abstrakten Basisklasse numbers.Rational und implementiert alle Methoden und Operationen dieser Klasse. Fraction-Instanzen sind hashable und sollten als unveränderlich behandelt werden. Darüber hinaus verfügt Fraction über die folgenden Eigenschaften und Methoden

Geändert in Version 3.2: Der Konstruktor Fraction akzeptiert jetzt Instanzen von float und decimal.Decimal.

Geändert in Version 3.9: Die Funktion math.gcd() wird nun verwendet, um numerator und denominator zu normalisieren. math.gcd() gibt immer einen int-Typ zurück. Zuvor hing der GCD-Typ von numerator und denominator ab.

Geändert in Version 3.11: Unterstriche sind nun beim Erstellen einer Fraction-Instanz aus einem String erlaubt, gemäß den Regeln von PEP 515.

Geändert in Version 3.11: Fraction implementiert nun __int__, um typing.SupportsInt Instanzprüfungen zu erfüllen.

Geändert in Version 3.12: Leerzeichen sind nun um den Schrägstrich für String-Eingaben erlaubt: Fraction('2 / 3').

Geändert in Version 3.12: Fraction-Instanzen unterstützen nun das Formatieren im Float-Stil mit den Darstellungstypen "e", "E", "f", "F", "g", "G" und "%"".

Geändert in Version 3.13: Das Formatieren von Fraction-Instanzen ohne einen Darstellungstyp unterstützt nun Füllzeichen, Ausrichtung, Vorzeichenbehandlung, Mindestbreite und Gruppierung.

Geändert in Version 3.14: Der Konstruktor Fraction akzeptiert nun beliebige Objekte mit der Methode as_integer_ratio().

numerator

Zähler des Bruchs in gekürzter Form.

denominator

Nenner des Bruchs in gekürzter Form. Garantiert positiv.

as_integer_ratio()

Gibt ein Tupel aus zwei ganzen Zahlen zurück, deren Verhältnis gleich dem ursprünglichen Bruch ist. Das Verhältnis ist gekürzt und hat einen positiven Nenner.

Hinzugefügt in Version 3.8.

is_integer()

Gibt True zurück, wenn der Bruch eine ganze Zahl ist.

Hinzugefügt in Version 3.12.

classmethod from_float(f)

Alternativer Konstruktor, der nur Instanzen von float oder numbers.Integral akzeptiert. Vorsicht: Fraction.from_float(0.3) hat nicht denselben Wert wie Fraction(3, 10).

Hinweis

Ab Python 3.2 können Sie auch direkt aus einem float eine Fraction-Instanz erstellen.

classmethod from_decimal(dec)

Alternativer Konstruktor, der nur Instanzen von decimal.Decimal oder numbers.Integral akzeptiert.

Hinweis

Ab Python 3.2 können Sie auch direkt aus einer decimal.Decimal-Instanz eine Fraction-Instanz erstellen.

classmethod from_number(number)

Alternativer Konstruktor, der nur Instanzen von numbers.Integral, numbers.Rational, float oder decimal.Decimal sowie Objekte mit der Methode as_integer_ratio() akzeptiert, aber keine Strings.

Hinzugefügt in Version 3.14.

limit_denominator(max_denominator=1000000)

Findet und gibt den nächstgelegenen Fraction zu self zurück, der einen Nenner von höchstens max_denominator hat. Diese Methode ist nützlich, um rationale Annäherungen an eine gegebene Gleitkommazahl zu finden

>>> from fractions import Fraction
>>> Fraction('3.1415926535897932').limit_denominator(1000)
Fraction(355, 113)

oder um eine rationale Zahl wiederherzustellen, die als Gleitkommazahl dargestellt ist.

>>> from math import pi, cos
>>> Fraction(cos(pi/3))
Fraction(4503599627370497, 9007199254740992)
>>> Fraction(cos(pi/3)).limit_denominator()
Fraction(1, 2)
>>> Fraction(1.1).limit_denominator()
Fraction(11, 10)
__floor__()

Gibt die größte ganze Zahl int zurück, die kleiner oder gleich self ist. Diese Methode kann auch über die Funktion math.floor() aufgerufen werden.

>>> from math import floor
>>> floor(Fraction(355, 113))
3
__ceil__()

Gibt die kleinste ganze Zahl int zurück, die größer oder gleich self ist. Diese Methode kann auch über die Funktion math.ceil() aufgerufen werden.

__round__()
__round__(ndigits)

Die erste Version gibt die nächstgelegene ganze Zahl int zu self zurück, wobei halb gerundet wird (zur geraden Zahl). Die zweite Version rundet self auf das nächste Vielfache von Fraction(1, 10**ndigits) (logischerweise, wenn ndigits negativ ist), ebenfalls halb zur geraden Zahl gerundet. Diese Methode kann auch über die Funktion round() aufgerufen werden.

__format__(format_spec, /)

Bietet Unterstützung für die Formatierung von Fraction-Instanzen über die Methode str.format(), die eingebaute Funktion format() oder Formatierte Zeichenkettenliterale.

Wenn der Formatierungsstring format_spec nicht mit einem der Darstellungstypen 'e', 'E', 'f', 'F', 'g', 'G' oder '%' endet, folgt die Formatierung den allgemeinen Regeln für Füllzeichen, Ausrichtung, Vorzeichenbehandlung, Mindestbreite und Gruppierung, wie im Format-Spezifikations-Mini-Sprache beschrieben. Das Flag für die alternative Form '#' wird unterstützt: Wenn es vorhanden ist, erzwingt es, dass die Ausgabezeichenkette immer einen expliziten Nenner enthält, auch wenn der formatierte Wert eine exakte ganze Zahl ist. Das Nullfüllungsflag '0' wird nicht unterstützt.

Wenn der Formatierungsstring format_spec mit einem der Darstellungstypen 'e', 'E', 'f', 'F', 'g', 'G' oder '%' endet, folgt die Formatierung den Regeln, die für den float-Typ im Abschnitt Format Specification Mini-Language beschrieben sind.

Hier sind einige Beispiele

>>> from fractions import Fraction
>>> format(Fraction(103993, 33102), '_')
'103_993/33_102'
>>> format(Fraction(1, 7), '.^+10')
'...+1/7...'
>>> format(Fraction(3, 1), '')
'3'
>>> format(Fraction(3, 1), '#')
'3/1'
>>> format(Fraction(1, 7), '.40g')
'0.1428571428571428571428571428571428571429'
>>> format(Fraction('1234567.855'), '_.2f')
'1_234_567.86'
>>> f"{Fraction(355, 113):*>20.6e}"
'********3.141593e+00'
>>> old_price, new_price = 499, 672
>>> "{:.2%} price increase".format(Fraction(new_price, old_price) - 1)
'34.67% price increase'

Siehe auch

Modul numbers

Die abstrakten Basisklassen, die den numerischen Turm bilden.