Eike Lange schrieb:
Hallo!
On Thu, May 27, 2004 at 08:02:00AM +0200, Dr. Egbert Seibertz wrote:
gibt's folgenden Fehler auch noch in der aktuellen Version? (man/frau achte auf den Wechsel von 232,60 nach 23259 (erstes Beispiel))
(Ich habe das Programm etwas umgeschrieben und jetzt läuft es:)
Das ursprüngliche Programm sagt auch mit der aktuellen GPC-Version 23259.
Dies ist aber nicht zwangsläufig ein Fehler. Schließlich rechnest du hier mit Fließkomma-Zahlen, die von Natur aus ungenau sind (sofern sie nicht eine endliche *Binär*-Bruch-Darstellung haben, was bei Hundersteln nicht der Fall ist).
Der tatsächlich verwendete Wert *muss* also ein bisschen zu groß oder zu klein sein. (Je nachdem, was näher ist. "Zufälligerweise" ist bei 232.60 bei `Real' offenbar der etwas kleinere Wert näher. Bei `ShortReal' und `LongReal' wäre es der größere. Dort geht es dann bei anderen Zahlen schief.) Nach der Multiplikation bleibt der Wert dann natürlich zu groß/klein, es sei denn, er wird (wiederum "zufällig") durch einen Rundungsfehler ausgeglichen.
Und da `Trunc' knallhart abschneidet (wie es ja sein soll), wird aus 23259.999999999999999 eben 23259. Mit `Round' fällt so ein Fehler weniger auf, ist aber prinzipiell auch möglich.
Daher die Moral von der Geschichte: Für Geldbeträge immer Integer-Typen (in der kleinsten Einheit, hier also Cent) verwenden. Unter http://gnu-pascal.de/contrib/frank/misc/moneyutils.pas habe ich übrigens eine kleine Unit zur komfortableren Ein-/Ausgabe solcher Typen.
Frank