Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Dezimal -> Bruch (https://www.delphipraxis.net/45639-dezimal-bruch.html)

TheMiller 9. Mai 2005 21:34


Dezimal -> Bruch
 
Hallo,

ich bin auf der Suche nach einer Klasse (oder Funktion) die eine Dezimalzahl in einen Bruch umwandelt. Gibt's das?

Danke im Voraus

DGL-luke 9. Mai 2005 21:51

Re: Dezimal -> Bruch
 
nö gibt es nicht. du kannst dir aber alle kommazahlen als kommazahl/1 vorstellen.

wenn du jetzt mit 10 malnimmst(streng gesagt erweiterst) bist du scohn bei kommazahl * 10 / 10tel.

jetzt noch n bisschen überlegen, dann bist du bei allen brüchen, die du haben willst. ;)

TheMiller 9. Mai 2005 21:54

Re: Dezimal -> Bruch
 
hm... das ist ganz schön viel arbeit...
nagut danke

Nikolas 9. Mai 2005 21:59

Re: Dezimal -> Bruch
 
Eine Möglichkeit wäre die Zahl mit AnzahlDerNachKommastellen*10 zu multiplizieren, also einfach das Komma rauszunehmen, die Zahl dann als Bruch darstellst, wobei du für denn Nenner die eben errechnete Zehnerpotenz nimmst und dann versuchst den Bruch so weit wie möglich zu kürzen.

TheMiller 9. Mai 2005 22:01

Re: Dezimal -> Bruch
 
Joa ok.

Das werde ich dann mal ausprobieren, wenn ich an dem entsprechenden Rechenschritt bin... Danke

Luckie 9. Mai 2005 22:10

Re: Dezimal -> Bruch
 
Zum Kürzen solltest du eigentlich Cod finden.

micho 16. Mai 2005 10:54

Re: Dezimal -> Bruch
 
Ich glaub die bisherigen Vorschläge sind vielleicht nicht optimal, da spätestens bei 47/31 so merkwürdige Brüche rauskommen wie: 1516129/1000000

Ich hab' da mal meine Phantasie spielen lassen und mir einen rekursiven Algorithmus aus den Fingern gesaugt:

Delphi-Quellcode:
procedure DezToBruch(DezimalZahl:double;var Zaehler,Nenner:integer;Tiefe:integer);
const ZuKlein=1E-6;
      Winzig=1E-12;
var GanzAnteil,a,b:integer;
begin
   GanzAnteil:=trunc(DezimalZahl+Winzig);
   if (Tiefe>1) and (abs(DezimalZahl-GanzAnteil)>ZuKlein) then begin
      DezToBruch(1/(DezimalZahl-GanzAnteil),a,b,Tiefe-1);
      Zaehler:=a*GanzAnteil+b;
      Nenner:=a;
   end else begin
      Zaehler:=GanzAnteil;
      Nenner:=1;
   end;
end;
Ich hätte den Algorithmus gerne an einem Beispiel erklärt, bin aber zu faul dafür. Deswegen lasse ich den Algorithmus sich von selbst erklären.

Einfaches Beispiel: 7/3=2.33333333
Delphi-Quellcode:
DezToBruch(2.33333333,Zaehler,Nenner,20);
Der ganzzahlige Anteil von 2.33333333 ist 2
Nach dem Komma bleibt also 0.33333333 übrig
Der Kehrwert davon ist 3.00000000, den wir versuchen als Bruch darzustellen
-----Der ganzzahlige Anteil von 3.00000000 ist 3
-----Nach dem Komma bleibt nicht viel übrig, also erhalten wir 3/1
Dabei kommt also 3/1 raus
Da das ja ein Kehrwert war, entspricht das 1/3
Mit der 2 vor dem Komma sind das zusammen 7/3


Kompliziertes Beispiel: 47/31=1.51612903
Delphi-Quellcode:
DezToBruch(1.51612903,Zaehler,Nenner,20);
Der ganzzahlige Anteil von 1.51612903 ist 1
Nach dem Komma bleibt also 0.51612903 übrig
Der Kehrwert davon ist 1.93750000, den wir versuchen als Bruch darzustellen
-----Der ganzzahlige Anteil von 1.93750000 ist 1
-----Nach dem Komma bleibt also 0.93750000 übrig
-----Der Kehrwert davon ist 1.06666667, den wir versuchen als Bruch darzustellen
----------Der ganzzahlige Anteil von 1.06666667 ist 1
----------Nach dem Komma bleibt also 0.06666667 übrig
----------Der Kehrwert davon ist 15.00000000, den wir versuchen als Bruch darzustellen
---------------Der ganzzahlige Anteil von 15.00000000 ist 15
---------------Nach dem Komma bleibt nicht viel übrig, also erhalten wir 15/1
----------Dabei kommt also 15/1 raus
----------Da das ja ein Kehrwert war, entspricht das 1/15
----------Mit der 1 vor dem Komma sind das zusammen 16/15
-----Dabei kommt also 16/15 raus
-----Da das ja ein Kehrwert war, entspricht das 15/16
-----Mit der 1 vor dem Komma sind das zusammen 31/16
Dabei kommt also 31/16 raus
Da das ja ein Kehrwert war, entspricht das 16/31
Mit der 1 vor dem Komma sind das zusammen 47/31


Hier ist nochmal der Algorithmus mit Selbsterklärungs-Funktion:
Delphi-Quellcode:
procedure DezToBruch(DezimalZahl:double;var Zaehler,Nenner:integer;Tiefe:integer);
const ZuKlein=1E-6;
      Winzig=1E-12;
var GanzAnteil,a,b:integer;
    s:string;
begin
   GanzAnteil:=trunc(DezimalZahl+Winzig);
   s:=DupeString('-----',20-Tiefe);
   TextAusgabe(s+'Der ganzzahlige Anteil von '+FloatToStrF(DezimalZahl,ffFixed,12,8)+' ist '+InttoStr(GanzAnteil));
   if (Tiefe>1) and (abs(DezimalZahl-GanzAnteil)>ZuKlein) then begin
      TextAusgabe(s+'Nach dem Komma bleibt also '+FloatToStrF(DezimalZahl-GanzAnteil,ffFixed,12,8)+' übrig');
      TextAusgabe(s+'Der Kehrwert davon ist '+FloatToStrF(1/(DezimalZahl-GanzAnteil+Winzig),ffFixed,12,8)+', den wir versuchen als Bruch darzustellen');
      DezToBruch(1/(DezimalZahl-GanzAnteil),a,b,Tiefe-1);
      TextAusgabe(s+'Dabei kommt also '+inttostr(a)+'/'+inttostr(b)+' raus');
      TextAusgabe(s+'Da das ja ein Kehrwert war, entspricht das '+inttostr(b)+'/'+inttostr(a));
      Zaehler:=a*GanzAnteil+b;
      Nenner:=a;
      TextAusgabe(s+'Mit der '+InttoStr(GanzAnteil)+' vor dem Komma sind das zusammen '+inttostr(zaehler)+'/'+inttostr(nenner));
   end else begin
      TextAusgabe(s+'Nach dem Komma bleibt nicht viel übrig, also erhalten wir '+IntToStr(GanzAnteil)+'/1');
      Zaehler:=GanzAnteil;
      Nenner:=1;
   end;
end;
Hoffe, ich konnte helfen,
Micho

_________________
www.michael-kreil.de


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz