So ist es allgemein:
Delphi-Quellcode:
Function RoundToGranularity(aValue, aGranularity: Double): Double;
Begin
Result := Trunc(aValue / aGranularity + 0.5 + 1E-10) * aGranularity
End;
In deinem Fall ist 'aGranularity' = 0.50.
Die Ergebnisse sind zwar (weil Floating-Point) nicht genau, aber die Darstellungsfehler in der 15.ten Stelle sind irrelevant, weil Du ja formatiert ausgibst. Dafür kannst Du dann in Ruhe mit den Werten rechnen. Die Rundungsfehler schaukeln sich nur bei extremen Werten und/oder langen Iterationen langsam hoch.
Wichtig ist hier die formatierte Ausgabe auf eine Nachkommastelle, aber das sollte man ohnehin machen.
Zitat von
grenzgaenger:
nicht umsonnst sollte man die floats vermeiden...
Äh.. nö. Man muss nur bei der Ausgabe etwas aufpassen. Floating Point Arithmetik ist nunmal um ein Vielfaches schneller und wird deshalb verwendet. Und Rundungsfehler gibt es auch bei BCD, nur keine Darstellungsfehler.