mehrere if-anweisungen



  • StrToFloat erwartet ein Punkt als Decimalseperator.
    Suche und Ersetze das Komma

    http://www.marquardtnet.info/cecke/quickies.1/1_quicky_02.html

    Im BCB 6 gibt es auch StringReplace

    Auch in der if Abfrage muss es ||==1.3 heissen. Ziffern mit Kommaanteil werden immer mit Punkt dargestellt.

    Das if kannst du ansonsten so lassen. Für bessere Lesbarkeit empfiehlt es sich jedoch

    if(erhalt==1
    	||erhalt==1.1
    	||erhalt==1.2
    	||erhalt==1.3
    	||erhalt==1.5.....
    (
    

    zu schreiben. Eine extra Klammerung ist nicht vonnöten. Eleganter ist natürlich ein Array mit den Werten, aber wenn du das noch nicht beherrschst tut's das if auch



  • sivino schrieb:

    liegt das am komma?

    Zumindest trägt das Komma seinen Teil bei. In C und C++ gibt es einen Kommaoperator, der dafür sorgt, daß jeweils die nach dem Komma angegebene Zahl ausgewertet wird. Statt des Dezimal-Kommas wird in C und C++, wie im englischen Sprachraum und auch allen anderen mir bekannten Sprachen, ein Dezimalpunkt verwendet.

    sivino schrieb:

    Edit4->Text = "Else Schleife";    //zum testen
    

    if und else sind keine Schleifen!

    Edit: Schon wieder viel zu spät 😞



  • danke für eure tipps...

    habe es mit . (punkt) versucht dazu noch anderst formatiert, jedoch ohne erfolg...

    3.3 erkennt er nicht als normwert... und gibt mir "Else-Schleife"(danke audacia ;-)) auf edit4 aus...



  • Schick es mir zu

    cecke@marquardtnet.info



  • Christian211 schrieb:

    StrToFloat erwartet ein Punkt als Decimalseperator.
    Suche und Ersetze das Komma

    Nicht ganz richtig. Je nach Region wird DecimalSeperator unterschiedlich gesetzt und verarbeitet in der VCL...



  • hast du schonmal überprüft, was für ein wert in der "erhalt"-Variable steht?

    mfg
    BigNeal



  • float-Werte NIE mit == vergleichen

    Aufgrund des internen Formats von Dezimahlzahlen sind viele Dezimalzahlen nicht exakt darstellbar. Das führt dazu, daß == nicht funktioniert.
    Deshalb muß man bei Floatwertüberprüfungen immer prüfen ob der Vergleichswert in einem bestimmten Intervall(die gewünschte Genauigkeit) liegt, sonst fällt man heftig auf die Nase.



  • MichelRT schrieb:

    float-Werte NIE mit == vergleichen

    *malneugierigsein*
    mit was soll man den sonst vergleichen?

    mfg
    BigNeal



  • siehe Edit meiner ursprünglichen Antwort



  • Man könnte sich eine Funktion schaffen, welche zwei float (oder double) Werte im Rahmen einer bestimmten Genauigkeit vergleicht.
    Da Gleitkommazahlen nie vollständig genau im Computer abgebildet werden, können schonmal zwei gleich erscheinende Zahlen beim Vergleich mit == false ergeben. Dazu gabs auch im C++-Forum schon ausfühliche Diskussionen.



  • Oder man kann auch CompareValue() verwenden.

    Gruß,

    Alexander



  • sofern man den BCB6 hat. Ich hab noch den BCB5 und da gibt es diese Funktion nicht.



  • oder man vergleicht mit gerundeten Werten, in diesem Fall Rundung auf eine Dezimalstelle.

    RoundTo(nWert,-1)
    


  • caspar_louis schrieb:

    oder man vergleicht mit gerundeten Werten, in diesem Fall Rundung auf eine Dezimalstelle.

    RoundTo(nWert,-1)
    

    *autsch* 👎



  • caspar_louis schrieb:

    oder man vergleicht mit gerundeten Werten, in diesem Fall Rundung auf eine Dezimalstelle.

    RoundTo(nWert,-1)
    

    Setzen 6



  • MichelRT schrieb:

    caspar_louis schrieb:

    oder man vergleicht mit gerundeten Werten, in diesem Fall Rundung auf eine Dezimalstelle.

    RoundTo(nWert,-1)
    

    Setzen 6

    Drück ich mich so verkehrt aus, oder denke ich so schief? 😕

    if (erhalt==3,3) || (erhalt==3,6) 
    {...} 
    // könnte schief gehen, weil Float-Wert erhalt so ggf. nicht mit 3,3 oder 3,6 [ob mit Komma oder Punkt] nicht gleich sind
    
    if (RoundTo(erhalt,-1)==3,3) || (RoundTo(erhalt,-1)==3,6)
    // sollte das Problem der Ungenauigkeit beheben, da ein Rundungsfehler weitgehend ausgeschlossen werden kann. erhalt wurde ja vorher eingeben, m.E. mit einer Dezimalstelle 
    {...}
    


  • Du denkst schief 😉
    Du vergleichst wieder Fließkommazahlen. Das funktioniert aber nicht.
    0,1 z.B. ist in der internen Fließkommadarstellung (Exponent/Mantisse) eine undendliche Periode und somit nicht darstellbar und somit auch nicht per == vergleichbar.
    Fließkommazahlen dürfen grundsätzlich NIE mit == verglichen werden.



  • MichelRT schrieb:

    Du vergleichst wieder Fließkommazahlen. Das funktioniert aber nicht.
    0,1 z.B. ist in der internen Fließkommadarstellung (Exponent/Mantisse) eine undendliche Periode und somit nicht darstellbar und somit auch nicht per == vergleichbar.

    Das ist mir klar.
    Ich dachte nur, ich sorge dafür daß beide Fließkommazahlen gleich sind. Z.B. 0,1 und 0,1 sollten doch jeweils die identische Fließkommadarstellung nach sich ziehen. Oder ist dort ein Teil zufällig ?

    Ich erinnere mich dunkel an meinen C++ Dozenten, der sagte, daß die Genauigkeit der beiden Werte übereinstimmen müsse, um einen == Vergleich zu ermöglichen. Stimmt das - oder habe ich mir das was falsches gemerkt ?



  • Die Genauigkeit ist der Knackpunkt, das hast Du Dir Richtig gemerkt.
    Z1 und Z2 sind mit der Genauigkeit X als gleich anzusehen wenn
    Z1 < Z2 + X UND Z1 > Z2 - X



  • MichelRT schrieb:

    Die Genauigkeit ist der Knackpunkt, das hast Du Dir Richtig gemerkt.
    Z1 und Z2 sind mit der Genauigkeit X als gleich anzusehen wenn
    Z1 < Z2 + X UND Z1 > Z2 - X

    ?!?
    Die Genauigkeit eines Dezimalwertes gibt die Stellen nach dem Komma an, die nicht Null sind.

    z.B. Genauigkeit=3 -> 2/3=0,3330

    Da fällt mir zu Z1 < Z2 + X UND Z1 > Z2 - X recht wenig ein. D.h., ich kann den Sinn darin nicht erkennen. Was ist für Dich X? 😕


Anmelden zum Antworten