Ein Problem, auf das Sie stoßen könnten, ist, dass nicht alle Bruchzahlen durch Doppelungen dargestellt werden können. Sogar einige Werte, die einfach aussehen, wie 0.1. Jetzt mit dem Pseudocode-Algorithmus. Sie würden wahrscheinlich am besten die Anzahl der 64stel eines Zolls bestimmen, aber den Dezimalanteil durch 0,015625 teilen. Danach können Sie Ihren Bruch auf den kleinsten gemeinsamen Nenner reduzieren. Da Sie jedoch Zoll angeben, möchten Sie vielleicht nicht den kleinsten gemeinsamen Nenner verwenden, sondern nur Werte, für die normalerweise Zoll angegeben sind, 2,4,8,16,32,64.
Es ist jedoch eine Sache, darauf hinzuweisen, dass, da Sie Zoll verwenden, die Werte alle richtige Bruchteile eines Zolls sind, mit einem Nenner von 2,4,8,16,32,64, dann sollte der Wert niemals enthalten Gleitkommafehler, weil der Nenner immer eine Potenz von 2 ist. Wenn Ihr Datensatz jedoch einen Wert von 0,1 Zoll hätte, würden Sie Probleme bekommen.
Wie wäre es mit org.apache.commons.math? Sie haben eine Fraktionsklasse, die ein Double braucht.
Sie sollten in der Lage sein, es zu erweitern und ihm Funktionalität für die 64th zu geben. Und Sie können auch einen toString hinzufügen, der ganz einfach den ganzen Zahlenteil des Bruches für Sie ausdruckt.
Fraktion (Doppelwert, int maxDenominator) Erstellen Sie einen Bruchteil gegeben den doppelten Wert und das Maximum Nenner.
Ich stimme nicht unbedingt zu, basierend auf der Tatsache, dass Milhous Zoll bis zu 1/64 Zoll abdecken will Angenommen, das Programm verlangt zu jeder Zeit eine Genauigkeit von 1/64 ", das sollte 6 Bits der Mantisse einnehmen. In einem Float gibt es 24-6 = 18, was (wenn meine Mathe richtig ist) bedeuten sollte, dass er eine hat Bereich von +/- 262144 + 63/64 "
Das könnte genügend Genauigkeit im Float sein, um ohne Verlust in die Fraktion konvertiert zu werden.
Und da die meisten Leute, die an Zoll arbeiten, Nenner von Potenzen von 2 verwenden, sollte es in Ordnung sein.
Aber zurück zur ursprünglichen Frage, ich kenne keine Bibliotheken, die das tun würden.
Funktion hierfür in einer C-Variante namens LPC folgt. Einige Hinweise:
Ich habe dies für mein Projekt geschrieben, ich hoffe, es könnte nützlich sein:
%Vor%Wie einige andere gezeigt haben, können Bruchteile von 64 präzise durch IEEE-Floats dargestellt werden. Dies bedeutet, dass wir auch durch Verschieben und Maskieren von Bits in einen Bruch konvertieren können.
Dies ist nicht der richtige Ort, um alle Details der Fließkommadarstellungen zu erklären. Weitere Informationen finden Sie in wikipedia .
Kurz gesagt: eine Fließkommazahl wird als (Vorzeichen) (exp) (frac) gespeichert, wobei Vorzeichen 1 Bit ist, exp ist 11 Bits und Frac ist der Bruchteil (nach 1.) und ist 52 Bits. Dies wird als Nummer festgelegt:
%Vor%Somit können wir den 64. Punkt erhalten, indem wir den Punkt entsprechend dem Exponenten verschieben und die 6 Bits nach dem Punkt ausblenden. In Java:
%Vor%(Dieser Code kann wahrscheinlich kürzer gemacht werden, aber das Lesen von Bit-Flipping-Code ist so schwer wie er ist ...)
Um dieses Problem (in einem meiner Projekte) zu lösen, habe ich die folgenden Schritte ausgeführt:
Tags und Links string java formatting