Float Wert auf zwei Stellen hinter Komme begrenzen



  • Hallo,

    ich möchte einen Float Wert auf zwei Stellen hinter dem Komma begrenzen. Ich habe das so versucht:

    Wert=(ffFixed, 7, 2);
    

    ("Wert" ist meine Float Wert)
    Wenn ich jetzt diesen Wert in einem Edit Feld ausgebe, dann steht dort nur eine 2 drin, was aber nicht der richtige Wert ist.

    Wo liegt mein Fehler?

    Danke



  • Dein Fehler ist, daß der Komma-Operator bestimmt nicht für eine derartige Begrenzung geeignet ist. Such dir lieber eine Rundungs-Funktion und dann verwende:

    Wert = round(ffFixed*100)/100;
    //oder
    Wert = round(ffFixed,2);
    //oder, oder, oder
    


  • Hallo

    die benötigte Funktion heißt FLoatToStrF

    Wert = FloatToStrF(ffFixed, 7, 2);
    

    bis bald
    akari



  • Bekomme die Fehlermeldung "Cannot convert 'AnsiString' to 'Float'?
    Wo liegt mein Fehler?



  • Hallo

    sorry, da fehlt natürlich noch die float-Zahl an sich

    float Wert = 12.3456;
    AnsiString Ausgabe = FloatToStrF(Wert, ffFixed, 7, 2);
    

    bis bald
    akari



  • @akari: Das dürfte aber nur funktionieren, wenn er die Nachkommastellen nur für die Ausgabe unterdrücken will. Wenn du mit der begrenzten Zahl weiterrechnen willst, kommst du um eine Rundung nicht herum (ich weiß nicht genau, ob der VCL eine Funktion anbietet, aber im Notfall kannst du sie selber schreiben:

    //Achtung - ungetestet
    
    double round(double x)
    { return (int)x+0.5; }
    
    double Wert = round(ffFixed*100)/100;
    


  • Da kommt bei mir die Fehlermeldung "Declaration syntax error" und bleibt nach der Befehlszeile "double round(doublex)" stehen.



  • Hallo

    zumindestens im BCB5 ist noch keine VCL-eigene Round-Funktion enthalten. Es würde also bei einer eigenen Funktion nach deinem Muster bleiben.
    Allerdings werden normalerweise float-Zahlen wirklich erst zur Ausgabe/als Endergebnis "in Form gebracht". Buchhaltärisch zum Beispiel ist es nur korrekt, alle Zwischenergebnisse mit höherer Präzision als 2 Stellen zu rechnen, und erst das Ergebnis aus 2 Stellen echt runden. Das kann bei mehreren Rechnungsposten, Rabatten in Prozent und Mehrwertsteuer schon einen Unterschied machen.

    /Edit : Ausßerdem gibt es noch einen technischen Einwand gegen das Runden von float-Werten an sich : es gibt keine Garantie für "runde" Werte. Das heißt bei abschließenden Division der round-Funktion kann wieder ein krummer Wert entstehen.
    Wenn also der Ausgangswert 1,23456 ist, könnte nach der Multiplikation 123,456 und nach der Division 1,229999 entstehen.

    bis bald
    akari



  • Hallo

    Da kommt bei mir die Fehlermeldung "Declaration syntax error" und bleibt nach der Befehlszeile "double round(doublex)" stehen.

    Dann kannst du nicht mal ordentlich Copy&Paste 🙄

    bis bald
    akari



  • Ok, jetzt klappts bei mir ohne Fehlermeldung, nur trotzdem habe ich noch ein Problem.
    Bei mir kommt jetzt immer der Wert 2,005 raus, egal was für einen Wert der Float Wert vorher hatte.



  • OK, das kann ich nachvollziehen. Aber solange wir nicht wissen, wofür carisma seine Float-Werte abschneiden will, können wir da nur Mutmaßungen anstellen. (@carisma: Das ist auch eine Bitte an dich, dein Problem im konkreten Umfeld vorzustellen ;))

    Womöglich wäre es ja auch eine Lösung für das Problem, gar keine Gleitkommazahlen zu verwenden, sondern mit Festkommazahlen zu arbeiten (d.h. du speicherst 100*ffFixed als int-Wert, rechnest mit ganzen Zahlen und dividierst es erst für die Ausgabe wieder durch 100).


Anmelden zum Antworten