Multiplikation zweier Variablen ergibt schlechtes Ergebnis
-
Hallo Leute,
ich habe folgendes Problem.
Ich habe eine Float Variable, die ich einfach mit einer ganzen Zahl multipliziere,
z.B. 1,1 * 1, das Ergebnis sollte 1,1 sein, es wird aber 1,10000002384186 angezeigt.
Wie kommt das?
Was kann man dagegen tun?float Anzahl=StrToFloat(StringReplace(Edit12->Text, "." , ",",TReplaceFlags()<<rfReplaceAll));
float volumen=StrToFloat(StringReplace(Edit105->Text, "." , ",",TReplaceFlags()<<rfReplaceAll));Edit108->Text=(Anzahl*volumen); // 1,1 *1=1,10000002384186
Gruß ahl
-
-
Vielen Dank!
Ich probiere es mal aus.
-
Hallo,
ich bekomme es nicht hin, könnt ihr mir mal helfen.
Anbei ein einfaches Beispiel.float ergebnis;
float e2=1;float e1 =StrToFloat(Edit1->Text); //liefert viele falsche Stellen, Edit1=1,99
ergebnis =e1*e2;
Memo1->Lines->Add(ergebnis); //liefert ein Ergebins von 1,99000000953674
-
Ich habe es jetzt so gemacht, aber es muss doch noch einfacher gehen (Funktion)
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString e1= FloatToStrF((StrToFloat(StringReplace(Edit1->Text, "." , ",",TReplaceFlags()<<rfReplaceAll))), ffNumber, 8, 2);
AnsiString e2= FloatToStrF((StrToFloat(StringReplace(Edit2->Text, "." , ",",TReplaceFlags()<<rfReplaceAll))), ffNumber, 8, 2);float e3=e1*e2;
AnsiString ergebnis= FloatToStrF(e3, ffNumber, 8, 2 );
Memo1->Lines->Add(e1);
Memo1->Lines->Add(e2);
Memo1->Lines->Add(ergebnis);}
-
ahl schrieb:
float e3=e1*e2;
AnsiString * AnsiString = float ???
Vielleicht ist der Compiler so schlau und setzt die richtigen Castings ein, ich habe es noch nie ausprobiert. Das Ergebnis ist aber trotzdem sehr fragwürdig.
Außerdem würde ich StrToFloatDef() anstelle von StrToFloat() verwenden.
StrToFloat() erzeugt bei ungültigen Daten (Edit1->Text) eine Exception.
StrToFloatDef() gibt bei ungültigen Daten den default-Wert zurück und erzeugt keine Exception.void __fastcall TForm1::Button1Click(TObject *Sender) { float fValue1 = StrToFloatDef(StringReplace(Edit1->Text, "." , ",",TReplaceFlags()<<rfReplaceAll), 0.0); float fValue2 = StrToFloatDef(StringReplace(Edit2->Text, "." , ",",TReplaceFlags()<<rfReplaceAll), 0.0); float fErgebnis = fValue1 * fValue1; AnsiString e1= FloatToStrF(fValue1, ffNumber, 8, 2); AnsiString e2= FloatToStrF(fValue2, ffNumber, 8, 2); AnsiString ergebnis= FloatToStrF(fErgebnis, ffNumber, 8, 2 ); Memo1->Lines->Add(e1); Memo1->Lines->Add(e2); Memo1->Lines->Add(ergebnis); }
-
Da hast Du recht mit AnsiString * AnsiString, das ist mir garnicht aufgefallen, aber es funktioniert.
StrToFloatDef schaue ich mir gleich mal an.