Da .333333333 nicht 1/3 ist, erhalten Sie niemals 1/3, sondern stattdessen 333333333/1000000000, wenn Sie keine clevere "Unrundung" -Logik hinzufügen.
Hier ist eine Lösung für den Umgang mit Zahlen mit periodischer Dezimaldarstellung, an die ich mich aus der Schule erinnere.
Eine Zahl 0. abcd abcd ... entspricht abcd / 9999. Also 0. 2357 2357 ... entspricht genau 2357/9999. Nimm einfach so viele 9er, wie dein Muster lang ist. 0. 1 1111 ... entspricht 1/9, 0. 12 1212 ... entspricht 12/99 und so weiter. Versuchen Sie also, ein Muster zu suchen und den Nenner auf die entsprechende Zahl zu setzen. Natürlich müssen Sie nach einigen Ziffern aufhören, weil Sie nie wissen werden, ob das Muster für immer oder nur für viele Male wiederholt wird. Und Sie werden den Rundungsfehler in der letzten Ziffer treffen, so dass Sie immer noch eine clevere Logik brauchen.
Das funktioniert nur in Excel-VBA, aber da du es mit "VBA" getaggt hast, werde ich es vorschlagen. Excel hat ein benutzerdefiniertes "Bruch" -Format, auf das Sie über "Zellen formatieren" (oder ctrl-1, wenn Sie bevorzugen) zugreifen können. Dieses spezielle Zahlenformat ist Excel-spezifisch und funktioniert daher nicht mit der VBA.Format-Funktion. Es funktioniert jedoch mit der Excel-Formel TEXT (). (Welches ist das Excel-Äquivalent von VBA.Format. Dies kann wie So zugegriffen werden:
%Vor%Um mehr als eine Ziffer anzuzeigen (Beispiel 5/12), erhöhen Sie einfach die Anzahl der Fragezeichen.
Google für "Dezimal zu Bruch" und Sie werden über eine gazillion Ergebnisse erhalten.
Ich mag wirklich dieses , weil es einfach ist, hat Quellcode (in RPL, ähnlich wie Forth, ~ 25 Zeilen), und ist ziemlich schnell (es ist geschrieben, um auf einer 4-Bit, 4 MHz-CPU zu laufen). Die Dokumente sagen:
In einem Buch mit dem Titel Lehrbuch der Algebra von G. Chrystal, 1. Auflage Ausgabe 1889, in Teil II, Kapitel 32, dieser verbesserte fortgesetzte Bruchteil Algorithmus ist vorgestellt und bewährt. Seltsam zu erzählen, spricht Chrystal davon, als ob es waren altes Wissen.
Diese Seite scheint in JavaScript eine wirklich gute Implementierung zu haben.
Sie können es annähern. Durchlaufen Sie im Wesentlichen alle Zähler und Nenner, bis Sie einen Bruch erreicht haben, der dem entspricht, was Sie wollen.
%Vor%Dies ist langsam und ein Brute-Force-Algorithmus, aber Sie sollten die allgemeine Idee bekommen.
Im Allgemeinen wird es einfacher, wenn Sie den sich wiederholenden Teil der rationalen Zahl finden. Wenn Sie das nicht finden können, haben Sie eine harte Zeit. Sagen wir die Nummer wenn 8.45735735735 ...
Die Antwort lautet 8 + 45/100 + 735/999/100 = 8 1523/3330.
Die ganze Zahl ist 8. Fügen Sie 45/100 hinzu - was .45 ist, der Teil vor dem sich wiederholenden Teil.
Der sich wiederholende Teil ist 735/999. Im Allgemeinen nehmen Sie den sich wiederholenden Teil. Mach es zum Zähler. Der Nenner ist 10 ^ (Anzahl der sich wiederholenden Ziffern) - 1.
Nehmen Sie den sich wiederholenden Teil und verschieben Sie die entsprechende Anzahl von Ziffern. In diesem Fall zwei, also durch 100 teilen, also 735/999/100.
Sobald Sie diese Teile herausgefunden haben, brauchen Sie nur einen Code, der Brüche mit den größten gemeinsamen Brüchen hinzufügt und reduziert ...
Ähnlich wie CookieOfFortune, aber es ist in VB und verwendet nicht so viel Brute-Force.
%Vor%... Lassen Sie mich wissen, ob es Werte über 1 berücksichtigen muss, und ich kann es anpassen.
BEARBEITEN: Entschuldigung für die vermasselte Syntax-Hervorhebung. Ich kann nicht verstehen, warum alles falsch ist. Wenn jemand weiß, wie ich es besser machen kann, lass es mich wissen.
Python hat eine schöne Routine in seinem Bruchmodul. Hier ist der Arbeitsabschnitt, der ein n / d in die engste Näherung N / D umwandelt, wobei D & lt; = ein gewisser Maximalwert. z.B. Wenn Sie den nächsten Bruch zu 0.347 finden wollen, lassen Sie n = 347, d = 1000 und max_denominator 100 und Sie erhalten (17, 49), was so nah wie möglich für Nenner kleiner oder gleich 100 ist Der Operator '//' ist eine Ganzzahl-Division, so dass 2 // 3 0 ergibt, dh a // b = int (a / b).
%Vor%1 / .3333333333 = 3 weil 1/3 = .3333333333333, also egal welche Nummer du tust, mach das,
doppelt x = 1 / deinDezimal; int y = Math.Ceil (x);
und jetzt Anzeige "1 /" + y
Ich weiß, dass dies ein alter Thread ist, aber ich stieß auf dieses Problem in Word VBA. Es gibt so viele Einschränkungen aufgrund der 8-Bit (16-stelligen) Runden, sowie Word VBA Dezimalzahlen in wissenschaftliche Notation usw. machen. Aber nachdem ich all diese Probleme bearbeitet habe, habe ich eine nette Funktion, die ich gerne teilen möchte ein paar zusätzliche Funktionen, die Sie hilfreich finden können.
Die Strategie entspricht dem, was Daniel Buckner schrieb. Grundsätzlich gilt:
1.) Entscheide, ob es eine abschließende Dezimalzahl ist oder nicht
2.) Wenn ja, setze einfach das Dezimaltail / 10 ^ n und reduziere den Bruch.
3.) Wenn es nicht beendet wird, versuchen Sie, ein sich wiederholendes Muster zu finden, einschließlich Fällen, in denen die Wiederholung nicht sofort beginnt
Bevor ich die Funktion poste, hier ein paar meiner Beobachtungen der Risiken und Einschränkungen, sowie einige Hinweise, die Ihnen helfen können, meinen Ansatz zu verstehen.
Risiken, Einschränkungen, Erklärungen:
- & gt; Optionaler Parameter "Nennwert" ermöglicht Ihnen, den Nenner des Bruches anzugeben, wenn Sie möchten, dass er gerundet wird. d. h. für Zoll können Sie wünschen, dass 16tel verwendet werden. Die Fraktionen werden jedoch immer noch reduziert, so 3,746 - & gt; 3 12/16 - & gt; 3 3/4
- & gt; Der optionale Parameter "construction", der auf True gesetzt ist, baut den Bruch mit dem Formeleditor auf und gibt den Text direkt in das aktive Dokument ein. Wenn Sie möchten, dass die Funktion einfach eine flache Zeichenkette des Bruches zurückgibt, damit Sie sie programmatisch speichern können, setzen Sie dies auf False.
- & gt; Eine Dezimalzahl könnte nach einer Reihe von Wiederholungen enden ... diese Funktion würde eine unendliche Wiederholung annehmen.
- & gt; Der Variablentyp Double setzt eine ganze Zahl für Dezimalziffern ab, wobei insgesamt 16 Ziffern zulässig sind (aus meinen Beobachtungen jedenfalls!). Diese Funktion setzt voraus, dass, wenn eine Nummer alle 16 der verfügbaren Ziffern verwendet, sie eine sich wiederholende Dezimalzahl sein muss. Eine große Zahl wie 123456789876.25 würde fälschlicherweise für eine sich wiederholende Dezimalzahl gehalten und dann als Dezimalzahl zurückgegeben, wenn kein Muster gefunden wurde.
- & gt; Um wirklich große abschließende Dezimalstellen aus 10 ^ n auszudrücken, kann VB nur 10 ^ 8 behandeln. Ich runde die origninal Zahl auf 8 Dezimalstellen ab und verliere vielleicht etwas Genauigkeit.
- & gt; Für die Mathematik hinter der Umwandlung wiederholter Muster in Brüche überprüfen Sie diesen Link
- & gt; Verwenden Sie den Euklidischen Algorithmus , um den Bruchteil zu reduzieren
Ok, hier ist es, geschrieben als Word-Makro:
%Vor%Tags und Links vba