if bedingung (mehrere bedingungen)



  • Allgemein ist eine Fließkommazahl der wohl ungeeignetste Basisdatentyp für Geldbeträge. Eine anfängerfreundliche, funktionierende Lösung wäre, mit Ganzzahlen (integer) in Cent zu rechnen.



  • na klar kann ich das mit 10,20 cent und 1euro=100 cent, 2 euro=200 cent machen, aber das is doch umständlich...?

    Was gibts es denn für einen grund warum es nicht mit gleitkommazahlen geht,
    wenn es bei anderen programmen nie probleme beim einlesen von .x zahlen gibt?



  • wenn du mit real zahlen machen willst, würde ich >= verwenden

    real bzw. Gleitpunktzahlen nie auf Gleichheit prüfen, das klappt in den wenigsten Fällen. (Kannte mal nen Spezialisten, der hat immer den Wert eines Temperaturfühlers mit == abgefragt)



  • Hawkaru schrieb:

    die einwurf variable wird kurz davor mit 0 initialisiert als float, bekommt also keine werte vorher
    und dann eingelesen vom benutzer mit float Typ

    Tja, genau das ist das Problem. Quick-Fix:

    1. Du vergleichst mit float-Konstanten: einwurf == 0.1f ODER
    2. Du deklarierst einwurf als double.

    Beim nächsten Mal gleich mit int.



  • Bashar schrieb:

    Hawkaru schrieb:

    die einwurf variable wird kurz davor mit 0 initialisiert als float, bekommt also keine werte vorher
    und dann eingelesen vom benutzer mit float Typ

    Tja, genau das ist das Problem. Quick-Fix:

    1. Du vergleichst mit float-Konstanten: einwurf == 0.1f ODER
    2. Du deklarierst einwurf als double.

    Beim nächsten Mal gleich mit int.

    Hah, danke das 1) hat geklappt
    das 2) mit double macht keinen unterschied, erkennt sie trotzdem nicht.

    Und mit int geht das natürlich aber dann würd ich ja nie mehr mit gleitkommazahlen arbeiten 🙄

    Abschlussfrage, wenn ich das richtig verstanden habe, kein problem mit gleitkommazahlen zu arbeiten solange ich sie nicht durch Gleicheit wie == oder != abfrage?


  • Mod

    Hawkaru schrieb:

    Und mit int geht das natürlich aber dann würd ich ja nie mehr mit gleitkommazahlen arbeiten 🙄

    Na und? Gleitkommazahlen sind hier nicht der richtige Datentyp und in vielen anderen Fällen auch nicht. Man muss nicht immer alles benutzen, bloß weil es das gibt.

    Abschlussfrage, wenn ich das richtig verstanden habe, kein problem mit gleitkommazahlen zu arbeiten solange ich sie nicht durch Gleicheit wie == oder != abfrage?

    Wichtige Feststellung: Gleitkommazahl ist nicht das, was man umgangssprachlich "Kommazahl" nennt. Gleitkommazahlen sind die Computerannäherung an das Kontinuum. Das heißt, sie finden vor allem in der Numerik und Computerphysik ihre Anwendung. Geld hingegen ist eine diskrete Größe, also vom Verhalten her quasi das Gegenteil von einer kontinuierlichen Größe. Daher sind Gleitkommazahlen derart ungeeignet für Finanzberechnungen.

    Lass dich nicht täuschen von der Ähnlichkeit in der Darstellung. Klar, Geld kann man als Kommazahl schreiben und die Gleitkommazahlen ebenfalls. Aber zu denken, dass sie deswegen miteinander verwandt wären, ist ein Trugschluss. Solche Modellierungprobleme werden dir noch öfters begegnen. Viele Anfängeraufgaben beinhalten den Umgang mit Daten, die auf den ersten Blick wie etwas anderes aussehen. Bekannte Beispiele sind Telefonnummern, Postleitzahlen und Kontonummern, die zwar auf den ersten Blick wie Zahlen aussehen, aber in Wirklichkeit Ziffernfolgen sind. Solche Beispiele gibt es zuhauf. Du musst da drauf achten, wie eine Größe sich verhält, wenn du den richtigen Datentyp wählen möchtest, nicht, wie sie auf Papier geschrieben aussieht.



  • Vielen Dank an alle für die gute und schnelle Hilfe.
    und danke für den wichtigen Hinweis Sepp 😉



  • Ich liebe das gute alte Cobol. Das hat für sowas pic 9999999v99. und das V steht für das Komma und da wird genau gearbeitet - schon mit cobol 68 (aus dem Jahre 1968). Habs selbst hier mit dem Hercules und mvs 3.8 am Laufen. Ist für monetäre Programme, wie Pferdeverwaltung mit Abrechnung Stallkosten ideal.



  • Jo, und in C gibts dafür int und long long. Da wird ebenso genau gearbeitet, aber weniger Speicher gebraucht und schneller gerechnet.



  • Hab mal spaßeshalber das auf ner realen Z/OS ausprobiert - Original
    Cobol-68 Lademodul - Format spielt beim Rechnen (5.000.000 Durchläufe
    einer Addition keine Rolle - nicht messbar auf heutigen Maschinen.

    08.55.28 JOB28311 ---- FRIDAY, 20 SEP 2013 ----
    08.55.28 JOB28311 IRR010I USERID QSCHAE IS ASSIGNED TO THIS JOB.
    08.55.28 JOB28311 ICH70001I QSCHAE LAST ACCESS AT 07:59:25 ON FRIDAY, SEPTEM
    08.55.28 JOB28311 $HASP373 QSCHAECP STARTED - INIT 3 - CLASS A - SYS AOK1
    08.55.28 JOB28311 IEF403I QSCHAECP - STARTED - TIME=08.55.28
    08.55.28 JOB28311 +BEGINN CPUTEST
    08.55.28 JOB28311 +ZAEHLEN BINAER
    08.55.28 JOB28311 +BINAER FERTIG
    08.55.28 JOB28311 +ZAEHLEN GEPACKT
    08.55.28 JOB28311 +ZAEHLEN GEPACKT FERTIG
    08.55.28 JOB28311 +ZAEHLEN UNGEPACKT
    08.55.28 JOB28311 +ZAEHLEN UNGEPACKT FERTIG
    08.55.28 JOB28311 +CPU-TEST BEENDET


Anmelden zum Antworten