FormatFloat

Für Fragen von Einsteigern und Programmieranfängern...
kawumm
Beiträge: 5
Registriert: Fr 9. Jul 2010, 10:22

FormatFloat

Beitrag von kawumm »

Hallo.
Ich habe ein kleines Problem mit FormatFloat. Ich habe ein kleines Progamm gebaut das bestimmte Sachen errechnet und am Ende einen Wert ausgibt. Wenn der Wert z.b. 21,1 ist soll er aber 21,10 schreiben. Also immer 2 Nachkommastellen. Ich habe folgendes geschrieben..

Code: Alles auswählen

Gsumme.Caption :=FormatFloat('#.###.###,##', summe);
hier wird trotzdem 21,1 ausgegeben.

Dann habe ich es mit

Code: Alles auswählen

Gsumme.Caption :=FormatFloat('#.###.##0,00', summe);
versucht. Da kommt dann 21,10000000000 raus.

Wie muss man FormatFloat richtig anwenden?

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: FormatFloat

Beitrag von theo »

Steht das nicht in der Beschreibung?: http://www.freepascal.org/docs-html/rtl ... float.html" onclick="window.open(this.href);return false;

Ich würde mal so probieren:
Caption :=FormatFloat('#,###,###.00', 21.1 );

Hängt vllt. noch von den Einstellungen ab, was Komma und Punkt bedeutet.

kawumm
Beiträge: 5
Registriert: Fr 9. Jul 2010, 10:22

Re: FormatFloat

Beitrag von kawumm »

Ausgezeichnet. das hat geklappt.

und ich hab ein neues bookmark. ;)

Jakane
Beiträge: 53
Registriert: Mo 21. Feb 2011, 14:35

Re: FormatFloat

Beitrag von Jakane »

Ich will mein Float auch formatieren :(

Wenn ich das aber so benutze, dann bekomm ich:

Code: Alles auswählen

kaiko_13.pas(822,49) Error: Incompatible type for arg no. 1: Got "AnsiString", expected "Int64"
Kann man irgendwie auch im 32er formatieren? Oder versteh ich die Fehlermeldung da falsch?
Im Grunde will ich Ganze Zahlen, aber da diese durch eine Division entsteht muss ich Float verwenden und bekomm dann 100,01 was eigendlich 100% dann darstellen soll -.-
Die Welt besteht aus Zahlen, also ist alles möglich.

Win XP

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: FormatFloat

Beitrag von MAC »

wenn du ganze zahlen willst dann round
oder du rechnest nicht

Code: Alles auswählen

112 / 2
sondern

Code: Alles auswählen

112 div 2
dann sollte da glaub ich automatisch abgerundet (bzw aufgerundet bei netagiven zahlen) werden

Code: Alles auswählen

Signatur := nil;

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: FormatFloat

Beitrag von Maik81ftl »

MAC hat geschrieben:wenn du ganze zahlen willst dann round
oder du rechnest nicht

Code: Alles auswählen

112 / 2
sondern

Code: Alles auswählen

112 div 2
dann sollte da glaub ich automatisch abgerundet (bzw aufgerundet bei netagiven zahlen) werden
Jain. soweit ich das noch im filter habe und da sag ich doch mal Herzlichen Dank an meine Lehrer hat der Befehl genauso wie in der Digitaltechnik nur die Aufgabe, bei einer Division den "Integerwert" auszuspucken.

d.H.

65 div 2 = 32
Analog der Mod befehl
65 mod 2 = 0.5

Ich formatiere meine Floats aber schon gennerell mit dem Befehl FloatToStrF. Habe auch den anderen ausprobiert, allerdings wollte der nie so wie er sollte. :D

Dennoch setzte ich bei alles rechenoperationen alle Var mind. als Real. um Probleme zu vermeiden. Der Round, so würde ich es sagen, ist Ähnlich dem FormatFloat zu setzten.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: FormatFloat

Beitrag von u-boot »

Maik81ftl hat geschrieben: 65 div 2 = 32
Analog der Mod befehl
65 mod 2 = 0.5
nich ganz ...
65 mod 2 ist immer noch 1 ... mod gibt den ganzzahligen rest der division zurück.
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: FormatFloat

Beitrag von MAC »

jop , mod ist das was man in der rundschule macht.
Zur erinnerung:
5 : 3 = 1 Rest 2
und mod gibt eben diesen Rest(2) aus

Code: Alles auswählen

Signatur := nil;

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: FormatFloat

Beitrag von Maik81ftl »

u-boot hat geschrieben:
Maik81ftl hat geschrieben: 65 div 2 = 32
Analog der Mod befehl
65 mod 2 = 0.5
nich ganz ...
65 mod 2 ist immer noch 1 ... mod gibt den ganzzahligen rest der division zurück.
Stimmt, da darf ruhig mal asche Übers Haupt kommen. :lol: wuste, das da was faul war. :D
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Jakane
Beiträge: 53
Registriert: Mo 21. Feb 2011, 14:35

Re: FormatFloat

Beitrag von Jakane »

Div und Mod gefällt mir besser, da kann man dann noch mehr Blödsinn anstellen :D danke

Allerdings seh ich grad...
Das geht auch nur mit Integer-Werten :(
Die Zahl die ich habe ist aber durch Vorberechnungen schon eine double

Also muss ich runden ^^ trotzdem danke
Jetzt kann ich mein halbes Programm neuschreiben xD

Nur eine Frage um Logik Probleme zu vermeiden

G:= 3,4
G1:= Round(G)
G2:= G1 * 2

G2 = 6,8 oder G2 = 6?
Die Welt besteht aus Zahlen, also ist alles möglich.

Win XP

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: FormatFloat

Beitrag von Maik81ftl »

Jakane hat geschrieben:Nur eine Frage um Logik Probleme zu vermeiden

G:= 3,4
G1:= Round(G)
G2:= G1 * 2

G2 = 6,8 oder G2 = 6?
Wie würden mein Lehrer und auch ander sagen:
nimm dir zettel uns Stift, denke an die Grundlagen (< .5 nach unten >.5 oben) und rechne selber
oder gaz einfach schau auf deine Handy-/Strom-/Gasrechnung die haben Netto 3 stellen nach dem "," ^^ Round hält sich in der regel immer an diese Grundsätzte.

Aber weil die Sagst
Jakane hat geschrieben:Die Zahl die ich habe ist aber durch Vorberechnungen schon eine double
dann zerleg dich ganz einfach diese zahl in 2 werte^^

bsp: Wert = 3,146 -->
X: 3
Y: 146

wie du diese zahlen allerding nun vereinzelst must du schon für dein Progi selber entscheiden.

nur soviel. For-schleife, Repeat-until-schleife und ggf. 2 bis 3 if abfragen (ist allerdongs abhändig von den Nachkommastellen.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: FormatFloat

Beitrag von MAC »

Jakane hat geschrieben: G:= 3,4
G1:= Round(G)
G2:= G1 * 2

G2 = 6,8 oder G2 = 6?
ja , dann spielen wir mal ne runde prozessor.

Code: Alles auswählen

G := 3,4
G1 := round(3,4);
if 0,4 > 0,5 then G1 := 4
else G1 := 3;
G1 = 3
G2 = G1 *2
G2 = 3 *2
G2 = 6;
gerundet wird so das kein komma mehr da steht :) wenn du auf eine stelle gerundet haben willst, dann gibt es dafür entweger eine tolle procedure oder round(x*10)/10;

Code: Alles auswählen

x := 3,45
x*10 = 34,5
round(34,5) = 35
35 / 10 = 3,5
das ergebnis 3,5 auf eine stelle gerundet

Code: Alles auswählen

Signatur := nil;

Jakane
Beiträge: 53
Registriert: Mo 21. Feb 2011, 14:35

Re: FormatFloat

Beitrag von Jakane »

gerundet wird so das kein komma mehr da steht :) wenn du auf eine stelle gerundet haben willst, dann gibt es dafür entweger eine tolle procedure oder round(x*10)/10;

Code: Alles auswählen

x := 3,45
x*10 = 34,5
round(34,5) = 35
35 / 10 = 3,5
das ergebnis 3,5 auf eine stelle gerundet
das merk ich mir :shock:

Danke :D

PS.: hier mal ein Ausschnitt wie ich vorher gerundet habe...

Code: Alles auswählen

D1:= StrToInt(Copy(F2,length(F2),1));
Case D1 of
  0, 2, 4, 6, 8 : D1:= StrToInt(FloatToStr((StrToFloat(F2)) / 2));
  1, 3, 5, 7, 9 : D1:= StrToInt(FloatToStr((StrToFloat(F2) - 1) / 2));
end;
und vereinfacht heisst das nichts anderes als ... D1:= F2 div 2 ...
Wobei durch 2 teilen noch einfach und übersichtlich ist...
Man teile mal durch 10 auf die Weise

:mrgreen:
Die Welt besteht aus Zahlen, also ist alles möglich.

Win XP

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: FormatFloat

Beitrag von MAC »

Jakane hat geschrieben: PS.: hier mal ein Ausschnitt wie ich vorher gerundet habe...

Code: Alles auswählen

D1:= StrToInt(Copy(F2,length(F2),1));
Case D1 of
  0, 2, 4, 6, 8 : D1:= StrToInt(FloatToStr((StrToFloat(F2)) / 2));
  1, 3, 5, 7, 9 : D1:= StrToInt(FloatToStr((StrToFloat(F2) - 1) / 2));
end;
Mathelehrer hat geschrieben:Mit Kanonen auf Spatzen geschossen...
:mrgreen:

Code: Alles auswählen

Signatur := nil;

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: FormatFloat

Beitrag von Maik81ftl »

MAC hat geschrieben:
Jakane hat geschrieben: PS.: hier mal ein Ausschnitt wie ich vorher gerundet habe...

Code: Alles auswählen

D1:= StrToInt(Copy(F2,length(F2),1));
Case D1 of
  0, 2, 4, 6, 8 : D1:= StrToInt(FloatToStr((StrToFloat(F2)) / 2));
  1, 3, 5, 7, 9 : D1:= StrToInt(FloatToStr((StrToFloat(F2) - 1) / 2));
end;
Mathelehrer hat geschrieben:Mit Kanonen auf Spatzen geschossen...
:mrgreen:
Hmmm da frag i mich doch glatz, mit was ich auf Spatzenschieße, wenn ich mir mal meine Rundung anschaue^^
Brauche zugegeben 2 Tellen nach dem Komma, da ich sonst mit der folgende Abfrage in Schwulität'n kommen könnte.

Code: Alles auswählen

Procedure TForm3.BMI;
var temp: Real;
begin
  with Form3 do
    begin
    Temp:= StrToFloat(FloatToStrf(StrtoFloat(Form3.Edit4.Text) /
                     (StrToFloat(Form3.Edit5.Text) *
                     (StrToFloat(Form3.Edit5.Text))), ffnumber, 0, 2));
    _User.BMI:= Temp;
    Label6.Caption:= 'BMI: ' + FloatToStr(temp);
    if Temp < 16.0 then
      begin
        label6.Color:= $4A708B;
        label6.Hint:= 'Sie haben starkes Untergewicht.';
      end;
    if (Temp >= 16.0) and (Temp <= 17.0) then
      begin
        label6.Color:= $4A708B;
        label6.Hint:= 'Sie haben mäßiges Untergewicht.';
      end;
    if (Temp >= 17.0) and (Temp <= 18.5) then
      begin
        label6.Color:= $4A708B;
        label6.Hint:= 'Sie haben leichtes Untergewicht.';
      end;
    if (Temp >= 18.5) and (Temp <= 25.0) then
      begin
        label6.Color:= $006400;
        label6.Hint:= 'Sie haben Normalgewicht.';
      end;
    if (Temp >= 25.0) and (Temp <= 30.0) then
      begin
        label6.Color:= clYellow;
        label6.Hint:= 'Sie haben Präadipositas.';
      end;
    if (Temp >= 30.0) and (Temp <= 35.0) then
      begin
        label6.Color:= $00A5FF;
        label6.Hint:= 'Sie haben Adipositas Grad I.';
      end;
    if (Temp >= 35.0) and (Temp <= 40.0) then
      begin
        label6.Color:= clRed;
        label6.Hint:= 'Sie haben Adipositas Grad II.';
      end;
    if (Temp >= 40.0)then
      begin
        label6.Color:= $0000B8;
        label6.Hint:= 'Sie haben Adipositas Grad III.';
      end;
    end;
end;
aba mal schaun, ob i das irgenwie in eine .so mit unterbringe...
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Antworten