AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dezimal -> Bruch

Ein Thema von TheMiller · begonnen am 9. Mai 2005 · letzter Beitrag vom 16. Mai 2005
Antwort Antwort
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#1

Dezimal -> Bruch

  Alt 9. Mai 2005, 21:34
Hallo,

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

Danke im Voraus
Bisheriger Nutzername "DJ-SPM"
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Dezimal -> Bruch

  Alt 9. Mai 2005, 21:51
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.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#3

Re: Dezimal -> Bruch

  Alt 9. Mai 2005, 21:54
hm... das ist ganz schön viel arbeit...
nagut danke
Bisheriger Nutzername "DJ-SPM"
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#4

Re: Dezimal -> Bruch

  Alt 9. Mai 2005, 21:59
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.
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#5

Re: Dezimal -> Bruch

  Alt 9. Mai 2005, 22:01
Joa ok.

Das werde ich dann mal ausprobieren, wenn ich an dem entsprechenden Rechenschritt bin... Danke
Bisheriger Nutzername "DJ-SPM"
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Dezimal -> Bruch

  Alt 9. Mai 2005, 22:10
Zum Kürzen solltest du eigentlich Cod finden.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
micho

Registriert seit: 16. Mai 2005
1 Beiträge
 
#7

Re: Dezimal -> Bruch

  Alt 16. Mai 2005, 10:54
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
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
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:00 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