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).