Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Periodische Zahl runden (https://www.delphipraxis.net/212969-periodische-zahl-runden.html)

Monday 30. Apr 2023 16:50

Periodische Zahl runden
 
Hallo,

wie kann ich eine periodische Zahl runden?

z.B. solcher Zahl 0,0122726666666667 (z.B. Runden auf 0,022726) oder solcher Zahl 0,125238888888889 (z.B. Runden auf 0,125238).

Ich möchte kein RoundTo verwenden, weil ich mich dann festlegen muss, wann gerundet werden muss. Aber es soll ja nur die periodische Zahl gerundet werden, und da weiß ich nicht, ab wann er auftritt.


Ich habe folgenden Code geschrieben, der aber noch nicht immer richtig funktioniert:

Delphi-Quellcode:

function periodische_Zahl_runden(input: string; periode:integer=3): string;
var
  a: integer;
  treffer: integer;
  neue_zahl : string;
begin
 if (pos(',',input) <= 0) AND (pos('.',input) <= 0) then begin result := input; exit; end; // Nur bei Dezimalzahlen

 //periode := 3; // wenn dreimal hintereinander die Zahl
 treffer := 0;

 for a := 1 to length(RemoveLastChar(input)) do
 begin
  if input[a] = input[a+1] then begin treffer := treffer+1; end else begin treffer := 0; end;

  if treffer >= periode then begin
    neue_zahl := copy(input,0,a-periode+1);
    break;
  end;
 end;

 if treffer < periode then begin
  neue_zahl := input;
 end;

 result := neue_zahl;

end;
Delphi-Quellcode:
  //ShowMessage( periodische_Zahl_runden('151.111324111111111')  );  // OK
  //ShowMessage( periodische_Zahl_runden('123,215')  );              // OK
  //ShowMessage( periodische_Zahl_runden('80170000000')  );          // OK Keine Periodische Zahl
  //ShowMessage( periodische_Zahl_runden('0,220027777777778')  );    // OK
  ShowMessage( periodische_Zahl_runden('0,0000004379')  );           //keine periodische Zahl - Wird zu früh abgeschnitten


Wie kann man den Code verbessern?

Gausi 30. Apr 2023 17:17

AW: Periodische Zahl runden
 
Was willst du eigentlich genau erreichen? :gruebel:

Woher weißt du denn, dass wegen drei gleichen Ziffern alle darauffolgenden Ziffern auch gleich sind? Und was machst du, wenn die Periodizität nicht aus nur einer Ziffer besteht, sondern aus mehreren? Eine belastbare Aussage dazu kannst du aus der String-Analyse ohnehin nicht ziehen. Von daher rundet man in der Regel auf eine bestimmte Anzahl signifikanter Stellen.

Wenn du angeben willst, dass die Dezimaldarstellung der Zahl "exakt" ist, wird es etwas komplizierter, würde ich denken.

Aber wenn du das so machen willst, dann würde ich die Analyse de Zahl von hinten beginnen - und dann einfach nur die erste der letzten paar gleichen Ziffern anzeigen. Dabei kannst du dann auch noch berücksichtigen, ob die letzte ggf. abweichende Ziffer (z.B. bei 0,66666667) durch Aufrunden zustande gekommen sein könnte.

Monday 30. Apr 2023 19:41

AW: Periodische Zahl runden
 
Zitat:

Zitat von Gausi (Beitrag 1521841)
Woher weißt du denn, dass wegen drei gleichen Ziffern alle darauffolgenden Ziffern auch gleich sind? Und was machst du, wenn die Periodizität nicht aus nur einer Ziffer besteht, sondern aus mehreren? Eine belastbare Aussage dazu kannst du aus der String-Analyse ohnehin nicht ziehen.

Oh da hast du recht, das hatte ich nicht bedacht. Hm vielleicht geht das auch gar nicht zum umzusetzen.

Die Zahl sollte einfach optisch schöner aussehen.

KodeZwerg 30. Apr 2023 20:34

AW: Periodische Zahl runden
 
Delphi-Quellcode:
function CutAtPeriod(const ADouble: Double; const AMinRepeating: Byte = 3): string;
var
  i, c: Integer;
  CutAt: Integer;
  s: string;
begin
  s := FloatToStrF(ADouble, ffFixed, 16, 16);
  Result := s;
  if Length(s) <= 3 then
    Exit;
  c := 0;
  CutAt := 0;
  for i := 3 to Pred(Length(s)) do
    begin
      if (s[Pred(i)] = s[i]) then
        Inc(c)
      else
        c := 0;
      if c >= AMinRepeating then
        begin
          CutAt := i;
          Break;
        end;
    end;
  if (CutAt > 0) then
    Result := Copy(s, 1, CutAt - AMinRepeating);
end;

TigerLilly 1. Mai 2023 11:00

AW: Periodische Zahl runden
 
Vielleicht hilft dir hier der mathematische Hintergrund:
https://www.arndt-bruenner.de/mathe/...odenlaenge.htm

Aber es gibt auch noch irrationale Zahlen und und die Periode der rationalen Zahlen kann ja an beliebiger Stelle auftreten (1/3, 1/30, 1/300 etc).

jobo 1. Mai 2023 21:02

AW: Periodische Zahl runden
 
Zitat:

Zitat von Monday (Beitrag 1521839)
Ich möchte kein RoundTo verwenden, weil ich mich dann festlegen muss

Musst Du Dich nicht festlegen? Hast Du unendlich Platz?
Die Frage kann doch höchstens sein, ob in einem gewissen (Darstellungs-)Bereich, die Periodizität eintritt oder?
Wenn Du N stellen maximal darstellen kannst, brauchst Du über alles danach nicht weiter nachzudenken.

Die eleganteste Art und verständlichste Art der Darstellung sind m.E. sowieso Brüche.

Rollo62 2. Mai 2023 13:41

AW: Periodische Zahl runden
 
Hier mal mehr Info
https://docwiki.embarcadero.com/RADS...nding_Routines
RoundTo benutzt "Bankers Rounding":
Weil der Link in RoundTo zu Bankers Rounding weg ist, vielleicht ist das Archiv hier auch interessant ?
https://learn.microsoft.com/en-us/ar...nkers-rounding

himitsu 2. Mai 2023 14:21

AW: Periodische Zahl runden
 
Über die Flags des mathematischen CoProzessors (für Win64 gibt es irgendwo bestimmt auch etwas) kann man einstellen, wie gerundet werden soll -> Bankers oder was Anderes.

Ich weiß, physischen gibt es schon ewig keinen CoProzessor mehr und der seckt direkt in der CPU, aber logisch war er für x86 noch vorhanden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:07 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