Autor Beitrag
Captain_Jack_Sparrow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 32



BeitragVerfasst: Fr 17.02.06 23:38 
Hallo

Meine Frage:
Ich habe eine Windows-Anwendung erstellt. In einer TextBox soll der Anwender eine Anzahl Münzen eingeben, die in usAnzahl gespeichert werden.
Des weiteren soll der Anwender aus einer Liste mit Radio-Buttons einen Geldwert (0,01 €; 0,02 €; 0,05 €; 0,10 €; ... 500,00 €) wählen, der dann in dWert gespeichert wird.
Über einen Button kann er dann auswählen, ob dieses Produkt (aus Münzenwert und Anzahl) von der Gesamtsumme dGesamt subtrahiert oder addiert werden soll.
Soweit kein Problem.
dGesamt wird mit 0 initialisiert.
Bei einer Subtraktion wird geprüft: if ((dGesamt - usAnzahl * dWert) >= 0) wenn diese bedingung erfüllt ist, wird die rechnung ganz normal durchgeführt. wenn sie NICHT erfüllt ist, wird eine MessageBox angezeigt mit dem Hinweise, dass der Wert unter 0 fallen würde und deshalb nicht möglich ist.

Mein Problem an Hand eines Beispiels:

Addiert man z.B. 1 * 0,02 und 1 * 0,01 wird dGesamt = 0,03. Logisch.
Nun subtrahiere ich 1 * 0,01. => dGesamt = 0,02
In einem weiteren Schritt subtrahiere ich nocheinmal 1 * 0,01. => dGesamt = 0,01
Noch ein Versuch zu subtrahieren: 1 * 0,01. eigentlich sollten von 0,01 nocheinmal 0,01 * 1 abgezogen werden. Dies ergäbe 0 und die Bedingung (s. oben) ist erfüllt. Doch stattdessen erhalte ich meine Fehlermeldung, dass der Wert unter 0 fallen würde..

Kann mir jmd. sagen wieso? Ich arbeite seit Stunden an diesem Problem und komme nicht weiter.
Bei einer unformatierten Ausgabe des Wertes erhalte ich "-3,46944695195361E-18" also einen mir unerschließlichen Wert unter 0, obewohl genau 0 das Ergebnis sein sollte...
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 17.02.06 23:56 
Hallo!

Das ist schon alles korrekt. Das Problem ist, dass Du bei der Arbeit mit Fließkommazahlen immer nur mit einer gewissen Genauigkeit arbeiten kannst. Du solltest daher keinen Vergleich "a = b" machen, sondern "|a - b| < eps", wobei eps die gewünschte Genauigkeit ist.

"a >= b" ist dann also "a - b > -eps", wenn ich mich zu so später Stunde nicht vertan habe ;-)

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Captain_Jack_Sparrow Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 32



BeitragVerfasst: Sa 18.02.06 00:15 
aber 0,01 * 1 ist doch ziemlich genau 0,01 ??

und a - b > -eps versteh ich nich wirklich.. könntest Du vllt. ein Beispiel geben? :)
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 18.02.06 00:20 
user profile iconCaptain_Jack_Sparrow hat folgendes geschrieben:
aber 0,01 * 1 ist doch ziemlich genau 0,01 ??
Nur in der Dezimaldarstellung. Der Rechner stellt Zahlen intern aber anders da. Suche in Wikipedia GLEITKOMMAZAHLEN

user profile iconCaptain_Jack_Sparrow hat folgendes geschrieben:
und a - b > -eps versteh ich nich wirklich.. könntest Du vllt. ein Beispiel geben? :)
Das ist doch praktisch schon Quelltext, welchen Teil verstehst Du nicht?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Captain_Jack_Sparrow Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 32



BeitragVerfasst: Sa 18.02.06 00:23 
was ich einsetzen soll^^

also a = dGesamt
b = dWert * usAnzahl

und was soll bei -eps rein?

Ich will ja letztendlich nur, dass ich wieder auf 0 komme
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 18.02.06 00:25 
user profile iconCaptain_Jack_Sparrow hat folgendes geschrieben:
und was soll bei -eps rein?
Die Genauigkeit, die Du haben willst. In diesem Fall wahrscheinlich ziemlich wurscht, Hauptsache kleiner 1 Cent ;-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Captain_Jack_Sparrow Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 32



BeitragVerfasst: Sa 18.02.06 00:32 
häää?

also

dGesamt - (dWert * usAnzahl) > -0.01

so?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 18.02.06 00:35 
user profile iconCaptain_Jack_Sparrow hat folgendes geschrieben:
häää?
Wieso hää? Es hat keinen Sinn, wenn Du hier so lange nachhakst, bist ich Dir Deinen Quelltext geschrieben habe. Du sollst schon verstehen, warum das so aussehen soll. Aber mit "Hää?" kann ich nichts anfangen, da musst Du schon konkreter werden.

Das eps sollte kleiner 1ct. sein und nicht gleich 1ct.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Captain_Jack_Sparrow Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 32



BeitragVerfasst: Sa 18.02.06 00:40 
du sollst mir ja den code nicht schreiben, sondern erklären, ich will ihn ja verstehen.. gemeint war "ich kapier grad gar nichts"
hab des so wie ichs geschrieben hab mal ausprobiert.. und es geht :)

du hast halt nicht erwähnt ob ich das richtig eingesetzt hatte... entschuldige bitte

ich hatte gedacht -eps wär ne funktion oder so.. aber als ich dann gemerkt hab, dass da -eps und nicht eps() stand hats *klick* gemacht..
ich glaub ich habs verstanden :)
dankeschön.. is ja mal ein guter start hier im forum.. mal schaun was sich noch so tut :)

Edit: Den ersten Satz so umgestellt, dass er sinn macht