Probleme mit Double und Geldbetrag
-
Hallo an alle hier im Forum
Ich habe Problem mit der anzeige von vollen Geldbeträgen.
Bsp: 5,50 * 2 // bekomme ich 11 € raus und nicht 11,00 €
selbst bei 5,50 € bekomme ich nur 5,5 €Code Bsp:
// Berechnung das Ergebniss aus Gesamt Feld Das --2 entfernt Leerzeichen und € Symbol AnsiString GesamtWert = DBKasse_BetragVoll->Text.SubString(0, DBKasse_BetragVoll->Text.Length()-2); AnsiString SendWert = Item->SubItems[0].Strings[1].SubString(0, Item->SubItems[0].Strings[1].Length()-2); double GesWert = GesamtWert.ToDouble() + (Item->Caption.ToInt() * SendWert.ToDouble());
Villeicht weiss einer weiter ... Besten Dank schonmal im vorraus
MFG
-
Abgesehen vom Darstellungsproblem...
Geld NIE in Euro verwalten, sondern nur in Cent oder Millicent. Ganzzahlig. int, long, longlong oder für die amerikanischen Stattsschulden eine BigInteger-Klasse besorgen. Hast einfach sonst keine Garantie, daß 0.3€+0.3€>=0.6€, weil die Fließkommazahlen 'irgendwie' ihre Zwischenergebnisse Runden. 30ct+30ct>=60ct, stimmt immer.
-
volkard schrieb:
Geld NIE in Euro verwalten, sondern...
...mit dem genau dafür vorgesehenen Typ
Currency
.
-
audacia schrieb:
volkard schrieb:
Geld NIE in Euro verwalten, sondern...
...mit dem genau dafür vorgesehenen Typ
Currency
.Verflixt!
Sorry, war zu lange unborlandig.
Sorry.
-
Hallo TheNewUser
Versuche es mal so habe es probiert somit funktioniert es mit der Berechnung.
// Berechnung das Ergebniss aus Gesamt Feld Das --2 entfernt Leerzeichen und € Symbol AnsiString GesamtWert = DBKasse_BetragVoll->Text.SubString(0, DBKasse_BetragVoll->Text.Length()-2); AnsiString SendWert = Item->SubItems[0].Strings[1].SubString(0, Item->SubItems[0].Strings[1].Length()-2); // Hier berechnen von z.B. 2 Zahlen 2 * 5,50 € Ergebniss ist 11,00 € nicht wie bei dir 11 € AnsiString GesWert = FloatToStrF(StrToFloat(GesamtWert)+ (Item->Caption.ToInt() * StrToFloat(SendWert)) , ffFixed, 8, 2 );
Grüsse
-
Und das Parsen ist doch so viel zu fehleranfällig: was ist wenn einfach "100€" dort steht (also ohne Leerzeichen)? -> Dann wird daraus dann einfach 10.
Im gesamten Programm intern nur den richtigen Datentyp TCurrency verwenden und nur bei der Nutzereingabe entsprechend (also korrekt!) parsen.