Autor Beitrag
gklement
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 03.04.09 19:22 
Hallo

ähnlich wie in vielen im Delphi Forum angeführten Bsp, formatiere ich seit Jahren Variablen des Typs Double aus Interbase.

Mit der von Ernesto angeführten Routine passiert bei mir folgendes:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button1Click(Sender: TObject);
var

  d: double;
  str: String;
begin
  d := StrToFloat(Edit1.Text);
  str := Format('%4.2f', [d]);
  Edit1.Text := str;
end;


Edit1 = 1,765 Formatierter Wert = 1,76 !!!!!!!!!!!!
Edit1 = 10,765 Formatierter Wert = 10,77

Allerdings habe ich mich darauf verlassen, dass der Wert 1,77 sein sollte...

Gleiches passiert aber auch bei der "normalen" FormatFloat Routine

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
var d : double; 
s : String

d := 1,765
s:= formatFloat('###,##0.00', d);

s hat den Wert '1,76' statt '1,77'

Ebenso wird bei 4,765 oder bei 5,765 oder der bei 6,765 und bei 7,765 auf x,76 gerundet.

Bei allen anderen Zahlen ob 0, 2,3,8,9,10,11,12,13 ..... erscheint der Wert xx,77

Die Routine ROUND funkt bei Double nicht und eigentlich handelt es sich "lediglich" um eine Aufsummierung von DB-Feldern!

Gibt es dafür eine noch logische Erklärung ??
Suche nun schon seit Tagen nach irgendwelchen Auswegen !

Hinweis:
Nehme ich statt '###,##0.00' den in Windows gespeicherten Kommawert und formatiere '###.##0,00' erhalte ich natürlich (als Zeichen, dass noch
irgendetwas normal funktioniert) die Fehlermeldung, dass der zu formatierende Wert KEIN Gleitkommawert ist !

10.000 Dank (ohne Komma) für Deine/Eure Hilfe !!


Gerald
PS Arbeite noch mit Delphi 2 C/S

Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt
silverhammer
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Fr 03.04.09 22:34 
Möglicherweise hat es etwas mit den Rundungsregeln zu tun (siehe de.wikipedia.org/wiki/Rundung unter Unverzerrte oder mathematische Rundung). Die wird für den IEEE-754-Standard für das Rechnen mit binären Gleitkommazahlen verwendet. Danach sollte 1,765 abgerundet werden, da nach der 5 nur noch Nullen folgen. Warum bei 0, 2 etc aufgerundet wird - hmmm??? Vielleicht wird durch das einlesen aus 0,765 ein 0,765000000001 oder so ??
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Fr 03.04.09 22:44 
Das Problem ist wohl, dass ein Single intern binär und nicht dezimal rechnet. Dadurch entstehen Rundungsfehler, die zu solch seltsamem Verhalten führen können.