20.4 Math_Fraction 

Besprochene Version: 0.3.0 | Lizenz: PHP |
Klassendatei(en): Math/Fraction.php; Math/FractionOp.php |
Vielleicht kennen Sie das Problem noch aus der Schule. Zwar ist es viel einfacher, mit Fließkommazahlen als mit Brüchen zu rechnen, aber in einigen Zusammenhängen sind Brüche einfach genauer und schöner darzustellen. Allerdings gibt es in PHP keinen Datentyp für die Darstellung von Brüchen. Diese Lücke schließt Math_Fraction.
Auch bei diesem Paket gilt, dass die Definition der Datenstruktur in einer anderen Datei vorgenommen wurde als die Deklaration der Rechenoperationen. Vor diesem Hintergrund empfiehlt es sich, die Datei Math/FractionOp.php einzubinden, die dann automatisch Math/Fraction.php inkludiert.
Die Zahl, die als Bruch dargestellt werden soll, übergeben Sie gleich dem Konstruktor. Interessant hierbei ist, dass Sie ihm entweder zwei Integer-Werte oder eine Fließkommazahl übergeben können. Im ersten Fall versucht das Paket, die Fließkommazahl näherungsweise durch einen Bruch darzustellen.
require_once("Math/FractionOp.php"); $float=3.14159265358979323846; $bruch=new Math_Fraction($float); if (true===PEAR::isError($bruch)) { die (bruch->getMessage()); } $zaehler=$bruch->getNum(); $nenner=$bruch->getDen(); $erg=$zaehler/$nenner; echo "Gegeben wurde: $float<br />"; echo "<u>$zaehler</u> = $erg<br />"; echo $nenner;
Listing 20.4 Nutzung von Math_Fraction
Wie Sie in Listing 20.4 sehen, können Sie direkt die Fließkommazahl übergeben. Das Paket erstellt dann einen Bruch auf Basis dieser Zahl. Um einen Bruch direkt zu definieren, müssten Sie den Zähler und Nenner als Integer-Werte an den Konstruktor übergeben: new Math_Fraction(2,5). Nachdem die Konvertierung stattgefunden hat, können Sie mit den Methoden getNum() und getDen() Zähler und Nenner auslesen.
Abbildung 20.1 Ausgabe des Scripts im Browser
Wie Sie in Abbildung 20.1 sehen können, ist der berechnete Bruch zum einen noch nicht gekürzt, und zum anderen fallen einige Nachkommastellen weg, was leider nicht immer zu vermeiden ist, da Integer-Zahlen nicht unendlich groß werden können.
Um einen solchen Bruch zu kürzen, ist die statische Methode simplify() vorgesehen. Sie bekommt ein Math_Fraction-Objekt übergeben und liefert die gekürzte Variante dieses Bruchs als neues Objekt zurück.
Für das obige Beispiel würde das Kürzen des Bruchs so aussehen:
Die Methode simplify() gehört zur Klasse Math_FractionOp, so dass sie auch über diese angesprochen werden muss. Um den Bruch auf einfachem Wege auszugeben, steht auch die Methode toString() zur Verfügung. Diese gibt Zähler und Nenner, getrennt durch einen Slash, zurück. In diesem Zusammenhang ist auch toFloat() hilfreich, die einen Bruch ausdividiert und das Ergebnis als Fließkommazahl zurückgibt.
Neben simplify() sind natürlich noch andere Methoden definiert, um sinnvoll mit Brüchen arbeiten zu können. Zum Addieren ist add() verfügbar, und eine Division können Sie mit sub() ausführen. Zum Multiplizieren und Dividieren sind mult() und div() vorgesehen. Alle Methoden bekommen mindestens zwei Parameter, nämlich die beiden Brüche, übergeben. Darüber hinaus können Sie mit einem dritten Parameter definieren, ob das Ergebnis automatisch gekürzt (true) werden soll oder nicht (false). Die Standardeinstellung ist, dass die Brüche automatisch gekürzt werden.
Möchten Sie zwei Brüche miteinander vergleichen, steht compare() zur Verfügung. compare() bekommt zwei Brüche übergeben und gibt die Zahl Null zurück, wenn beide Werte identisch sind. Ist der Wert des linken Bruchs kleiner, ist -1 der Rückgabewert und sonst 1. Hierbei ist zu beachten, dass der Vergleich auf Basis der ausdividierten Werte stattfindet und sich im Einzelfall ein Fehler einschleichen könnte, wenn der Unterschied außerhalb der Fließkomma-Genauigkeit von PHP liegt.
Eine einfache, aber vielleicht hilfreiche Methode ist noch reciprocal(), die den Kehrwert eines übergebenen Bruchs zurückgibt.
Alle vorgenannten Methoden liefern im Falle eines Fehlers ein PEAR_Error-Objekt zurück.