Einzelnen Beitrag anzeigen

Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#1

Runden liefert falsches Ergebnis

  Alt 18. Dez 2009, 13:30
Hi@all!

Ich habe mir mal den spass gemacht und eine eigene Rundungsfunktion geschrieben. Es geht hier um das Prinzip, ich möchte also verstehen, warum ich falsche Ergebnisse bekomme und nicht hören, dass Delphi ja eine interne Rundungsfunktion hat :

Delphi-Quellcode:

function roundexact(X:extended;digits:integer):extended;
var intzahl:integer;
    intzahl2:integer;
begin

 intzahl:=trunc(x*power(10,digits+1));
 intzahl2:=trunc(x*power(10,digits))*10;

 if intzahl-intzahl2 < 5 then
  result:=intzahl2/power(10,digits+1)
 else
  result:=int(intzahl2/10+1)/power(10,digits);


end;
Zum Fehler:

An und für sich funktioniert diese Funktion super. Ich glaube auch nicht, dass der Fehler direkt an dem Funktionsaufbau liegt, sondern daran, wie Delphi intern Single zu Extended etc konvertiert:

Ich habe folgende Berechnung, die am Schluss gerundet werden soll:

Code:
3675*(14/200+0.009)
Das Ergebnis ist, wie jeder noch leicht selber ausrechnen können sollte: 290.325

Demzufolge müsste unsere Rundungsfunktion als Ergebnis 290.33 liefern, richtig?

Dies tut sie auch, wenn ich sie mit folgendem Befehl starte:

showmessage(floattostr(roundexact(290.325,2))); //Messagebox zeigt wie erwartet 290.33 an Wenn ich aber schreibe:

showmessage(floattostr(roundexact(3675*(14/200+0.009),2))); //Messagebox zeigt 290.32 an ?!?! erhalte ich als ergebnis 290.32

Kann mir das jemand erklären??

Ich habe mal ein bisschen mit dem Debugger rumgespielt:

Wenn das Ergebnis falsch berechnet wird, liefert

intzahl:=trunc(x*power(10,digits+1)); das Ergebnis 290324 anstatt von 290325

WARUM???


Viele Grüße,
Michael

[edit] Mit X als Single-precision funktionierts! Warum? Ist da ein Delphi-interner Fehler bei der Umwandlung von Single->Extended oder hat das generell irgendwas mit der Darstellbarkeit von Zahlen in Computer zu tun? -> Schätze Delphi wandelt das Ergebnis bei der Parameterübergabe in 290.324999999999999999 um oder so?[/edit]

[edit2] Dafür gehts dann mit anderen Zahlen nicht mehr...z.B. 4650*0.0995=462.675 ... woran liegt das??? [/edit2]
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat