Format doppelt als Bruch [geschlossen]

7

Gibt es eine Bibliothek, die ein Double in einen String mit der ganzen Zahl konvertiert, gefolgt von einem Bruch?

Zum Beispiel

%Vor%

Ich suche nur nach Brüchen bis zu einem 64stel Zoll.

    
Milhous 18.12.2008, 20:39
quelle

10 Antworten

10

Ihr Problem ist ziemlich einfach, weil Sie sicher sind, dass der Nenner 64. in C # teilen wird (jemand kann eine Java-Version übersetzen):

%Vor%

Bonus: Code Golf

%Vor%     
Jimmy 18.12.2008 21:01
quelle
5

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.

    
Kibbee 18.12.2008 20:44
quelle
4

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.

    
Cheese Daneish 18.12.2008 21:55
quelle
3

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.

    
Calyth 18.12.2008 20:53
quelle
1

Funktion hierfür in einer C-Variante namens LPC folgt. Einige Hinweise:

  1. Zusätzlich zum Eingabewert am Anfang soll versucht werden, mit Präzisionsproblemen fertig zu werden, die sonst gerne auftauchen und Ihnen sagen, dass 5 4 999999/1000000 ist.
  2. Die Funktion to_int () schneidet auf Integer ab.
  3. Sprache hat eine to_string (), die einige floats in Exponentialschreibweise verwandelt.
%Vor%     
chaos 18.12.2008 20:59
quelle
1

Ich habe dies für mein Projekt geschrieben, ich hoffe, es könnte nützlich sein:

%Vor%     
Kevin Lopez 11.09.2011 08:04
quelle
0

Mein Code sieht so aus.

%Vor%     
Milhous 18.12.2008 21:04
quelle
0

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 ...)

    
Rolf Rander 19.12.2008 11:59
quelle
0

Ich erstelle einfach Fraction-Bibliothek.

Die Bibliothek ist hier verfügbar: Ссылка

Beispiel:

%Vor%     
thomas.adamjak 27.10.2015 18:59
quelle
-1

Um dieses Problem (in einem meiner Projekte) zu lösen, habe ich die folgenden Schritte ausgeführt:

  • Erstellt ein Wörterbuch mit Dezimal / Bruch-Strings.
  • Schrieb eine Funktion, um das Wörterbuch nach dem am besten passenden Bruchteil zu durchsuchen, abhängig vom "Dezimal" -Teil der Zahl und den übereinstimmenden Kriterien.
user21826 18.12.2008 21:22
quelle

Tags und Links