Problem mit FormatFloat "'AnsiString' nach 'double' nicht möglich" - Wieso?



  • Hallo Zusammen,
    ich habe ein Problem mit FormatFloat. Folgendes möchte ich realisieren:

    hs001_preis = StrToInt(neue_bestellung->Ehs001_menge->Text) * 14.90;
    hs001_preis = FormatFloat("#0.00",hs001_preis);
    
    hs002_preis = StrToInt(neue_bestellung->Ehs002_menge->Text) * 14.90;
    hs002_preis = FormatFloat("#0.00",hs002_preis);
    
    gesamtpreis = hs001_preis + hs002_preis;
    gesamtpreis = FormatFloat("#0.00",StrToFloat(gesamtpreis));
    

    Dabei gilt folgendes:

    double hs001_preis = 0, hs002_preis = 0;
    AnsiString gesamtpreis
    

    Leider bekomme ich folgende Fehlermeldung

    [C++ Fehler] neue_bestellung_cpp.cpp(139): E2034 Konvertierung von 'AnsiString' nach 'double' nicht möglich
    

    Was mache ich da falsch? Wie kann ich einem Double-Wert sagen das er zwei Nachkommastellen haben soll?

    Danke im voraus für Hilfe.



  • Hallo

    Was erwartest du?

    hs001_preis = FormatFloat("#0.00",hs001_preis);
    

    FormatFloat gibt einen AnsiString zurück, hs001_preis ist ein double. Natürlich beschwert sich der Compiler.

    bis bald
    akari



  • Ok... Das natürlich logisch. Aber wie kann ich einer Double-Variablen sagen, dass sie zwei Nachkommastellen haben soll?



  • Hallo

    Das ist nicht sinnvoll möglich, Fließkommazahlen sind aus ihrer technischen Definition heraus nicht exakt.
    Exaktheit kommt erst beim Umwandeln von float in Strings, für die Benutzerausgabe.

    Las die beiden Umwandlungen einfach weg, durch die Addition könnte die Genauigkeit sowieso wieder leiden.

    double hs001_preis = 0, hs002_preis = 0, gesamtpreis = 0;
    
    hs001_preis = StrToInt(neue_bestellung->Ehs001_menge->Text) * 14.90;
    hs002_preis = StrToInt(neue_bestellung->Ehs002_menge->Text) * 14.90;
    
    gesamtpreis = hs001_preis + hs002_preis;
    EditAusgabe->Text = FormatFloat("#0.00", gesamtpreis);
    

    bis bald
    akari



  • Das Problem ist nur, dass ich die Einzelpreise auch mit zwei Nachkommastellen benötige. Die Werte erscheinen auf einer Rechnung und da muss ich die mit ausgeben. Gibts denn keine Möglichkeit?
    Mir würde jetzt nur einfallen, die Werte nach der Addition in einen String zu packen und dann mit FormatFloat umzuwandeln. Finde das nur bischen umständlich. Gibts da nicht auch was einfacheres?



  • Hallo

    Du must zwischen der eigentlichen internen Rechnung mit den floats und der Ausgabe der Werte für Benutzer trennen. Dann ist das kein Problem.

    double hs001_preis = 0, hs002_preis = 0, gesamtpreis = 0;
    
    hs001_preis = StrToInt(neue_bestellung->Ehs001_menge->Text) * 14.90;
    hs002_preis = StrToInt(neue_bestellung->Ehs002_menge->Text) * 14.90;
    
    gesamtpreis = hs001_preis + hs002_preis;
    EditAusgabe->Text = FormatFloat("#0.00", gesamtpreis); 
    EditPreis1->Text = FormatFloat("#0.00", hs001_preis); 
    EditPreis2->Text = FormatFloat("#0.00", hs002_preis);
    

    Das hat natürlich den kleinen aber nicht zu vernachlässigenden Fehler das unter Umständen die Ausgabe der Zwischenwerte sich durch Rundungsfehler um einen Cent von der Ausgabe der Summe unterscheiden könnte. Dieses Problem bekommst du aber nur in Griff wenn du für solche Kaufmännischen Rechnungen auf alle FLießkommazahlen verzichtest und nur mit Integer-Typen rechnest. Dazu must du dann aber nicht in Euro, sondern in Cent rechnen. Die korrekte Ausgabe in Euro ist dann nur eine Formatierungsfrage.

    bis bald
    akari



  • akari schrieb:

    Dieses Problem bekommst du aber nur in Griff wenn du für solche Kaufmännischen Rechnungen auf alle FLießkommazahlen verzichtest und nur mit Integer-Typen rechnest.

    Dazu eignet sich der Delphi-Typ Currency, den es auch im C++Builder gibt, hervorragend.

    Zum Runden auf eine bestimmte Anzahl Nachkommastellen gibt es das hier.


Anmelden zum Antworten