AGB  ·  Datenschutz  ·  Impressum  







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

Periodische Zahl runden

Ein Thema von Monday · begonnen am 30. Apr 2023 · letzter Beitrag vom 2. Mai 2023
Antwort Antwort
Monday

Registriert seit: 24. Aug 2012
103 Beiträge
 
FreePascal / Lazarus
 
#1

Periodische Zahl runden

  Alt 30. Apr 2023, 17:50
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?
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
880 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Periodische Zahl runden

  Alt 30. Apr 2023, 18:17
Was willst du eigentlich genau erreichen?

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.
The angels have the phone box.
  Mit Zitat antworten Zitat
Monday

Registriert seit: 24. Aug 2012
103 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Periodische Zahl runden

  Alt 30. Apr 2023, 20:41
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.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Periodische Zahl runden

  Alt 30. Apr 2023, 21:34
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;
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.205 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Periodische Zahl runden

  Alt 1. Mai 2023, 12:00
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).
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#6

AW: Periodische Zahl runden

  Alt 1. Mai 2023, 22:02
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.
Gruß, Jo
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.094 Beiträge
 
Delphi 12 Athens
 
#7

AW: Periodische Zahl runden

  Alt 2. Mai 2023, 14:41
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#8

AW: Periodische Zahl runden

  Alt 2. Mai 2023, 15:21
Ü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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  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 07:51 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