![]() |
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? |
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. |
AW: Periodische Zahl runden
Zitat:
Die Zahl sollte einfach optisch schöner aussehen. |
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; |
AW: Periodische Zahl runden
Vielleicht hilft dir hier der mathematische Hintergrund:
![]() 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). |
AW: Periodische Zahl runden
Zitat:
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. |
AW: Periodische Zahl runden
Hier mal mehr Info
![]() RoundTo benutzt "Bankers Rounding": Weil der Link in RoundTo zu Bankers Rounding weg ist, vielleicht ist das Archiv hier auch interessant ? ![]() |
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 23:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz