Einzelnen Beitrag anzeigen

Achim Kalwa

Registriert seit: 2. Apr 2005
Ort: Lienen
104 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Ich dreh durch! wie kann das sein - Problem beim Runden.

  Alt 29. Jun 2007, 16:14
Zitat von Cyberstorm:
bei folgendem code kommt bei mir einmal 1.14 raus (obwohl 1.13 rauskommen soll) und bei der direkten variante 1.13 obwohl s1 und s2 beide male 2.26 ist und das der gleiche verdammte aufruf ist *Grml*.
bei allen anderen zahlen die ich damit so runde hat das super geklappt nur bei dieser konstellation nicht :-/. wenn man z.b. a[5] durch 0.82 und dafür a[6] durch .021 ersetzt klappts wieder?
ich dreh durch...

Delphi-Quellcode:
var
  s1, s2: double;
  i: Integer;
Computer können nicht genau rechnen
Im Ernst: Statt dem von uns Menschen bevorzugten Zehnersystem rechnet der Computer ja im Binärsystem. Zahlen wie 2.26 oder 1.13 können in den Gleitkommatypen wie Single, Double, Extended nicht exakt abgebildet werden:
0.5 = 2 hoch -1 = 1/2
0.25 = 2 hoch -2 = 1/4
0.125 = 2 hoch -3 = 1/8
usw.

Versuche mal, 0.3 als Summe von Zweierpotenzen abzubilden:
0.3 = 1/4 + 1/32 + 1/64 + 1/256 = 0.30078125

Ein Dezimalbruch wie 0.3 kann nur näherungsweise im Binärsystem gespeichert werden, denn dort ist es eine Zahl mit vielen Nachkommastellen, u.U. unendlich periodisch. Durch die begrenzte Länge der Datentypen wird diese Folge von Nachkommastellen irgendwo abgeschnitten; die Zahl ist ungenau. Wenn Du nun diese ungenauen Zahlen addierst, dann addierst Du auch die Fehler.

Für Deine Aufgabe ist daher ein geeigneter Datentyp erforderlich; bei Geldbeträgen bis 4 Nachkommastellen ist "Currency" die richtige Wahl.

Weitere Infos:
http://de.wikipedia.org/wiki/Rechengenauigkeit
Achim
  Mit Zitat antworten Zitat