PHP konvertiert Dezimal in Bruch und zurück?
Möchte ich dem Benutzer die Möglichkeit zu geben in einem Bruchteil wie:
1/2
2 1/4
3
Konvertieren und es in die entsprechende Dezimalzahl gespeichert werden in MySQL, so kann ich um durch Sie und andere Vergleiche.
Aber ich muss in der Lage sein, zu konvertieren Sie die Dezimalzahl zurück zu einem Bruchteil bei der Anzeige für den Benutzer
also im Prinzip brauche ich eine Funktion, die konvertiert Bruchteil string zu dezimal:
fraction_to_decimal("2 1/4");//return 2.25
und eine Funktion konvertiert eine Dezimalzahl, um eine Fraktion string:
decimal_to_fraction(.5); //return "1/2"
Wie kann ich dies tun?
InformationsquelleAutor der Frage JD Isaacks | 2009-12-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, ich würde lagern Sie die string-Darstellung auch, da, sobald Sie die Mathematik, du bist nicht bekommen es zurück!
Und, hier eine quick-n-dirty-compute-Funktion, keine Garantien:
Oh, der Vollständigkeit halber, hinzufügen stellen Sie sicher, dass
$fraction['denominator'] != 0
.InformationsquelleAutor der Antwort Derek Illchuk
Manchmal müssen Sie einen Weg finden, es zu tun, und die Rundung ist akzeptabel. Also, wenn Sie entscheiden, welcher Bereich der Rundung klappt für Sie Sie bauen können eine Funktion wie diese. Konvertieren einer Dezimalzahl in die Fraktion, die es am ehesten. Verlängern Sie die Genauigkeit durch hinzufügen weiterer Nenner getestet werden.
InformationsquelleAutor der Antwort mmcconkie
Zu können PEAR Math_Fraction Klasse für einige Ihre Bedürfnisse
InformationsquelleAutor der Antwort codaddict
Hier ist eine Lösung, ermittelt zunächst eine gültige Bruchteil (wenn auch nicht unbedingt die einfachste Fraktion). So 0.05 -> 5/100. Das bestimmt dann den größten gemeinsamen Teiler von Zähler und Nenner zu reduzieren, es auf die einfachste Fraktion, 1/20.
Diese umfasst eine Reine PHP-Implementierung des gcd obwohl, wenn Sie sicher sind, dass die gmp-Modul installiert ist, könnten Sie verwenden Sie die eine, die kommt mit gcd.
Als viele andere festgestellt haben, müssen Sie die Verwendung von rationalen zahlen. Also, wenn Sie konvertieren 1/7 in eine Dezimalzahl dann versuchen, Sie zu konvertieren zurück in eine Dezimalzahl, werden Sie kein Glück, weil die Präzision verloren wird verhindern, dass es immer wieder zu 1/7. Für meine Zwecke ist dies akzeptabel, da alle die zahlen, die ich bin den Umgang mit (standard-Messungen) sind rationale zahlen sowieso.
InformationsquelleAutor der Antwort Eric Anderson
Wenig Verbesserung zu oben, aber keepin es einfach.
InformationsquelleAutor der Antwort doublejosh
Kumpels, kann dies helfen?
[]s
InformationsquelleAutor der Antwort Marlon Pascoal
Ansatz wäre zum abrufen der dezimal-Wert und multiplizieren Sie mit 2, 3, 4 und so weiter, bis Sie eine ganze Zahl sein.
Allerdings würd ich mich mit der Antwort von Derek. Ratet mal, was passiert, wenn ein Benutzer fügt n/(n+1) mit n hoch. Ein solcher Algorithmus hätte zur überprüfung aller zahlen bis n+1.
Nicht zu erwähnen, es ist wahrscheinlich, dass Sie mit der Annäherung Probleme.
InformationsquelleAutor der Antwort Jir
Müssen Sie stehen vor einem ernsten problem, denn die Schwimmer sind nicht präzise genug.
Wenn Sie ' ll haben, um mit
1.3333
PHP eine Schätzung dieses Wertes... So werden Sie nie in der Lage sein, es zu konvertieren, um1 1/3
.Scheint es einfach zu sein zu überwinden, aber wenn Sie wollen, Ihr Programm zu unterscheiden
1/7901
(~ 1,2656625743576762435134793064169e-4
) mit1/7907
(~
) genau... das wird ein echter Teufel !!1,2647021626406981155937776653598e-4
IMHO, wenn Sie sich mit Mathematik, Sie sollte sich auf einem externen Bibliothek... oder versuchen, PHP die Kommunikation mit Matlab.
Wenn du mehr wissen möchtest, schlage ich vor, Sie Graben in der floating-point-Probleme... Angefangen mit wikipedia.
InformationsquelleAutor der Antwort Arno
Einer variation von Jir ' s Ansatz könnte funktionieren, wenn nur eine begrenzte Menge der Nenner verwendet werden : multiplizieren Sie alles, was durch den kleinsten gemeinsamen Nenner (und Runde das Ergebnis zu verwerfen übrigen Dezimalzahlen durch Näherung).
I. e.: wenn Sie nur noch Hälften, thrids und Viertel, multiplizieren Sie einfach alles durch 12.
Und auch wenn Sie wissen, der gemeinsame Nenner, das sollte erheblich reduzieren die such-Geschwindigkeit, indem Sie genau wissen, welche zahlen zu suchen statt suchen alle n+1 möglich.
Wenn Sie es zu tun haben mit vielen ungewöhnlichen Fraktionen, wie 1/7, 1/13, etc. gut, halten Sie sich an Derek, der die Lösung und speichern den ursprünglichen Wert zu.
InformationsquelleAutor der Antwort DrYak
Den Bruch zu dezimal ist Recht einfach und es gibt viele Lösungen. Ich würde mich mit dem trimmen die Zeichenfolge, ersetzen von Leerzeichen durch '+', und alles andere als Platz,/,. oder Ziffern mit " dann läuft es durch 'eval'.
Den dezimal zu Bruchzahl ist praktisch unmöglich, zu tun, richtig - nicht zuletzt, weil der Dezimalbruch wäre wahrscheinlich umgewandelt werden müssen binäre ersten, an welcher Stelle verlieren Sie sehr viel Präzision. Als eine Akademische übung.....Wenn Sie Leben können mit der Differenz zwischen 20976/41953 und 1/2, dann könnten Sie versuchen, einen fuzzy-match für eine vordefinierte Anzahl Fraktionen:
(es ist wahrscheinlich ein ordentlicher Art und Weise der Implementierung des gleichen Algorithmus, aber das überlasse ich Ihnen als übung für den Leser).
Aber ich persönlich würde nur speichern die ursprüngliche Darstellung in einem separaten Feld in der Datenbank.
InformationsquelleAutor der Antwort symcbean
Dann
$f == $n /$d
Beispiel:
Ausgänge:
InformationsquelleAutor der Antwort Frederik Krautwald
Machte ich einen blog-post mit ein paar Lösungen für diese, die letzten Ansatz, den ich fand ist:
http://www.carlosabundis.com/2014/03/25/converting-decimals-to-fractions-with-php-v2/
InformationsquelleAutor der Antwort Carlos Abundis
Nur das hinzufügen ein bisschen mehr Logik zu Derek ' s Antwort akzeptiert - check für "division durch null", und die ganze Zahl Eingabe überprüfen.
InformationsquelleAutor der Antwort Stan
InformationsquelleAutor der Antwort ricanontherun