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 -- Frank Heckenbach, frank@g-n-u.de, http://fjf.gnu.de/, 7977168E GPC To-Do list, latest features, fixed bugs: http://www.gnu-pascal.de/todo.html GPC download signing key: 51FF C1F0 1A77 C6C2 4482 4DDC 117A 9773 7F88 1707