Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - getraenkeautomat & realdatentyp - RUNDUNGSFEHLER?!


mick - Mo 22.09.08 23:06
Titel: getraenkeautomat & realdatentyp - RUNDUNGSFEHLER?!
salve, experten!

prolog:
ich habe hier ein (womoeglich einigen bekanntes, fuer mich ber kniffliges) problem mit delphi vorliegen, das ich nicht in den griff bekomme.

kontext:
theoretische informatik, simulation eines einfachen getraenkeautomaten (endlicher automat), den man mit muenzen fuettern kann, um ein getraenk zu bekommen (siehe datei im anhang).

problem:
im code stimmt alles. doch wenn ich 0,80 cent drin habe und ein wasser mag, bekomme ich keines.

annahme:
es scheint im speziellen an den 0,20-cent-schritten zu liegen, das problem tritt nur da auf. womoeglich liegt es an der binaerdarstellung des wertes. demnach ein rundungsfehler?!

erste loesungsidee:
hm, gedacht, getan und round sowie roundto eingesetzt (z.b. "RoundTo(Geldbetrag,1) >= RoundTo(Wasserpreis,1)"). doch entweder habe ich das falsch gemacht, oder es geht trotzdem nicht. kann dann naemlich getraenke "ziehen", ohne eine muenze eingeworfen zu haben...

frage:
wer weiss, woran es liegt und wie man es in den griff bekommt?


beste gruesse,

ciao,
mick.


Delete - Mo 22.09.08 23:15

bei foats darf man nie auf gleichheit abfragen, sondern muss auf eine gewisse genauigkeit (epsilon) prüfen. das ist auch schon der ganze trick dabei.


Jann1k - Mo 22.09.08 23:21

Du kannst auch einfach mit integern arbeiten und dann alles in Cent rechnen


mick - Di 23.09.08 06:58

danke fuer die antworten.

werde dann wohl in cent arbeiten.

dennoch nachfragen:

- ist das mit fliesskommawerten in anderen prog-sprachen auch so?
- gibt es keine moeglichkeit, das mit round hinzubekommen?
- was bedeutet der zusatz in klammern "epsilon"?

danke + gruss,
mick.


Delete - Di 23.09.08 07:41

user profile iconmick hat folgendes geschrieben:
dennoch nachfragen:

- (1) ist das mit fliesskommawerten in anderen prog-sprachen auch so?
- (2) gibt es keine moeglichkeit, das mit round hinzubekommen?
- (3) was bedeutet der zusatz in klammern "epsilon"?


Dachte die Erklärung wäre ausreichend, für jemanden der Theoretische-Informatik Studiert. Daher knapp die zugehörigen Antworten.

  1. Ja in allen, hängt vom Zahlentyp ab
  2. Nein, da Round (Fliesskomma) wieder Fliesskomma ergibt
  3. ist die Genauigkeit mit der man vergleichen möchte (if abs(a-b)<E then gleich)


<HTH> GG

Edit: sieh dir zu (3) auch mal die unit Math an, hier findest du die compare funktionen, bei welchen du nur Epsilon mit anzugeben brauchst.


BenBE - Di 23.09.08 10:16

Es gibt einen Datentyp Currency, der für Währungsbeträge am besten geeignet ist.


Delete - Di 23.09.08 12:10

user profile iconBenBE hat folgendes geschrieben:
Es gibt einen Datentyp Currency, der für Währungsbeträge am besten geeignet ist.


der ist nicht schlecht, ist ja ein integer ;-) . daneben gibts noch die klassische möglichkeit mit BCD zahlen.


mick - Di 23.09.08 15:50

lieber grenzgaenger,

danke fuer deine neuerliche antwort, hast mir geholfen.
den kleinen seitenhieb in deiner antwort werde ich daher auch schlichtweg mal ignorieren. habe kein schlechtes gewissen ob meiner womoeglich naiven nachfrage.

lieber benbe,

der tipp mit Currency ist sehr interessant, habe mich nach aktuellem stand dafuer entschieden.

danke zusammen,

ciao,
mick.


Delete - Di 23.09.08 16:17

Zitat:
salve

Es heißt "Salvete".Es ist nun mal Plural... :P


mick - Di 23.09.08 17:35

klugmann macht seinem namen alle ehre...

danke fuer den hinweis an den nicht-lateiner,

ciao,
mick.


Delete - Di 23.09.08 18:20

Hab viel von meinen Vorfahren geerbt... :mrgreen: