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.


Log in to reply