(Co-Admin)
Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
Delphi 2010 Professional
|
AW: SimpleRoundTo
26. Dez 2012, 14:50
Hallo,
ich kann Dein Problem mit dem Rundungfehler leider - noch nicht ganz - nachvollziehen. In Anlehnung an Bummis Beispiel ergibt sich bei mir für:
Delphi-Quellcode:
var
a, b : Extended;
begin
a := 0.55;
b := 18.5;
Caption := FloatToStr(SimpleRoundTo (a * b))
end;
stets der Wert 10,18 (auch mit anderen Werten für a und b die entsprechend korrekte Rundung); also das, was Du eigentlich auch erwartest.
Gehe ich hingegen her und kopiere mir sozusagen den Code aus SimpleRoundTo und nehme:
Delphi-Quellcode:
var
f : Double;
a, b, c : Extended;
begin
a := 0.55;
b := 18.5;
f := IntPower (10, -2);
c := Trunc((a * b / f) + 0.5) * f;
Caption := FloatToStr(c)
end;
erhalte ich das fehlerhafte Ergebnis 10,17. Für a, b, c : Double; erhalte ich korrekte Ergebnisse (SimpleRoundTo erwartet an der Stelle auch Double). Versuch' s doch mal mit Double für a und b.
Ich haben dann die Konstante 0.5 auf 0.5+1E-15 (also ein winzigkleinwenigmehr als 0.5) geändert. (Ich glaube zumindest, das es 1E-15 war, keine Ahnung)
Ich will jetzt ja nicht klugsch..., aber nur ein "winzigkleinwenigmehr" in Form von 1E-15 aufzuaddieren scheint mir dann doch nicht die geeignete Lösung zu sein. Besser wäre dann doch mit der relativen Maschinengenauigkeit zu rechnen, als einen x-beliebigen Wert zu nehmen.
Gruß
Also das mit dem Double werde ich versuchen! Hast du eine Begründung, warum Extended hier nicht funktioniert? Das hat doch eine bessere Auflösung.
Ich glaube ich versuche einmal die Rundungsfunktionen hier http://cc.embarcadero.com/Download.aspx?id=21909
Albert Live long and prosper
MrSpock
Geändert von MrSpock (26. Dez 2012 um 15:17 Uhr)
|
|
Zitat
|