AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Variable als Float definieren

Ein Thema von Don Muhkuh · begonnen am 13. Okt 2012 · letzter Beitrag vom 15. Okt 2012
Antwort Antwort
Seite 1 von 2  1 2      
Don Muhkuh

Registriert seit: 13. Okt 2012
4 Beiträge
 
Delphi 7 Personal
 
#1

Variable als Float definieren

  Alt 13. Okt 2012, 22:08
Hallo liebe Community,

das ist mein erster Post und ich habe ein Problem:

Ich will einen Währungsumrechner erstellen.
Dafür geb ich jeder Währung einen Wert, der für ihn steht, aber mein Problem ist,
dass man (meiner Erkenntnissen nach) Variablen nicht mit Float angeben kann (Die Wärungen haben einen Komma-Wert).
Dann habe ich probiert, die Zahlen einfach zu erhöhen (alle * 100000), um keine Komma-Zahlen zu bekommen.
Da ergab sich aber das Problem, dass die Ergebnisse keine Nachkommastellen hatten.

Hier ist der Code:

Delphi-Quellcode:
unit mWaehrungen;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Buttons, Mask, Grids;

type
  TFWaehrungen = class(TForm)
    ImHintergrund: TImage;
    Bt1AusD: TBitBtn;
    Bt1Euro: TBitBtn;
    Bt1Fr: TBitBtn;
    Bt1KanD: TBitBtn;
    Bt1Peso: TBitBtn;
    Bt1Pfund: TBitBtn;
    Bt1Real: TBitBtn;
    Bt1USD: TBitBtn;
    Bt1Yen: TBitBtn;
    Bt1Yuan: TBitBtn;
    Bt1Zlo: TBitBtn;
    Bt2AusD: TBitBtn;
    Bt2Euro: TBitBtn;
    Bt2Fr: TBitBtn;
    Bt2KanD: TBitBtn;
    Bt2Peso: TBitBtn;
    Bt2Pfund: TBitBtn;
    Bt2Real: TBitBtn;
    Bt2USD: TBitBtn;
    Bt2Yen: TBitBtn;
    Bt2Yuan: TBitBtn;
    Bt2Zlo: TBitBtn;
    Ed1Laender: TLabeledEdit;
    Ed2Laender: TLabeledEdit;
    LiW1: TListBox;
    LiL1: TListBox;
    LiW2: TListBox;
    LiL2: TListBox;
    LiW3: TListBox;
    LiL3: TListBox;
    BtNachSeite: TButton;
    BtVorSeite: TButton;
    LaKurs: TLabel;
    LaAnfang: TLabel;
    LaEnde: TLabel;
    LaWEnde1: TLabel;
    LaWEnde2: TLabel;
    EdWaehrungA: TEdit;
    EdKurs: TEdit;
    EdWaehrungB: TEdit;
    BtTauschen: TButton;
    LaWAnfang: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure BtVorSeiteClick(Sender: TObject);
    procedure BtNachSeiteClick(Sender: TObject);
    procedure Bt1EuroClick(Sender: TObject);
    procedure Bt2EuroClick(Sender: TObject);
    procedure Bt1USDClick(Sender: TObject);
    procedure Bt2USDClick(Sender: TObject);
    procedure Bt1PfundClick(Sender: TObject);
    procedure Bt2PfundClick(Sender: TObject);
    procedure Bt1FrClick(Sender: TObject);
    procedure Bt2FrClick(Sender: TObject);
    procedure Bt1ZloClick(Sender: TObject);
    procedure Bt2ZloClick(Sender: TObject);
    procedure Bt1KanDClick(Sender: TObject);
    procedure Bt2KanDClick(Sender: TObject);
    procedure Bt1AusDClick(Sender: TObject);
    procedure Bt2AusDClick(Sender: TObject);
    procedure Bt1YenClick(Sender: TObject);
    procedure Bt2YenClick(Sender: TObject);
    procedure Bt1YuanClick(Sender: TObject);
    procedure Bt2YuanClick(Sender: TObject);
    procedure Bt1PesoClick(Sender: TObject);
    procedure Bt2PesoClick(Sender: TObject);
    procedure Bt1RealClick(Sender: TObject);
    procedure Bt2RealClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  FWaehrungen: TFWaehrungen;
  Waehrung_A, Waehrung_B: Integer;
  Seite: Byte;

implementation

{$R *.dfm}

procedure TFWaehrungen.FormCreate(Sender: TObject);
begin
  With ImHintergrund.Canvas Do
    begin
    Brush.Color := clGreen;
    Rectangle(0, 0, 800, 100);
    Brush.Color := clHighlight;
    Rectangle(0, 100, 800, 400);
    Brush.Color := clGreen;
    Rectangle(0, 400, 800, 500);
    end;
  Waehrung_A := 100000;
  Waehrung_B := 100000;
  Seite := 1;
  LiL2.Visible := False;
  LiW2.Visible := False;
  LiL3.Visible := False;
  LiW3.Visible := False;
  BtVorSeite.Enabled := False;
end;

procedure TFWaehrungen.BtVorSeiteClick(Sender: TObject);
begin
  Seite := Seite - 1;
  If Seite = 1 Then
    begin
    BtVorSeite.Enabled := False;
    BtNachSeite.Enabled := True;
    LiL1.Visible := True;
    LiW1.Visible := True;
    LiL2.Visible := False;
    LiW2.Visible := False;
    LiL3.Visible := False;
    LiW3.Visible := False;
    end;
  If Seite = 2 Then
    begin
    BtVorSeite.Enabled := True;
    BtNachSeite.Enabled := True;
    LiL1.Visible := False;
    LiW1.Visible := False;
    LiL2.Visible := True;
    LiW2.Visible := True;
    LiL3.Visible := False;
    LiW3.Visible := False;
    end;
end;

procedure TFWaehrungen.BtNachSeiteClick(Sender: TObject);
begin
  Seite := Seite + 1;
  If Seite = 2 Then
    begin
    BtVorSeite.Enabled := True;
    BtNachSeite.Enabled := True;
    LiL1.Visible := False;
    LiW1.Visible := False;
    LiL2.Visible := True;
    LiW2.Visible := True;
    LiL3.Visible := False;
    LiW3.Visible := False;
    end;
  If Seite = 3 Then
    begin
    BtVorSeite.Enabled := True;
    BtNachSeite.Enabled := False;
    LiL1.Visible := False;
    LiW1.Visible := False;
    LiL2.Visible := False;
    LiW2.Visible := False;
    LiL3.Visible := True;
    LiW3.Visible := True;
    end;
end;

procedure TFWaehrungen.Bt1EuroClick(Sender: TObject);
begin
  Waehrung_A := 100000;
  EdWaehrungB.Text := FloatToStr(StrToFloat(EdWaehrungA.Text) * (Waehrung_B Div Waehrung_A));
  EdKurs.Text := FloatToStr(Waehrung_B Div Waehrung_A);
  LaWAnfang.Caption := 'Euro (Europa)';
  LaKurs.Caption := '1 Euro (Europa) =';
  LaKurs.Left := 190 - LaKurs.Width;
end;

procedure TFWaehrungen.Bt2EuroClick(Sender: TObject);
begin
  Waehrung_B := 100000;
  EdWaehrungB.Text := FloatToStr(StrToFloat(EdWaehrungA.Text) * (Waehrung_B Div Waehrung_A));
  EdKurs.Text := FloatToStr(Waehrung_B Div Waehrung_A);
  LaWEnde1.Caption := 'Euro (Europa)';
  LaWEnde2.Caption := 'Euro (Europa)';
end;

procedure TFWaehrungen.Bt1USDClick(Sender: TObject);
begin
  Waehrung_A := 129373;
  EdWaehrungB.Text := FloatToStr(StrToFloat(EdWaehrungA.Text) * (Waehrung_B Div Waehrung_A));
  EdKurs.Text := FloatToStr(Waehrung_B Div Waehrung_A);
  LaWAnfang.Caption := 'Dollar (Vereinigte Staaten)';
  LaKurs.Caption := '1 Dollar (Vereinigte Staaten) =';
  LaKurs.Left := 190 - LaKurs.Width;
end;

procedure TFWaehrungen.Bt2USDClick(Sender: TObject);
begin
  Waehrung_B := 129373;
  EdWaehrungB.Text := FloatToStr(StrToFloat(EdWaehrungA.Text) * (Waehrung_B Div Waehrung_A));
  EdKurs.Text := FloatToStr(Waehrung_B Div Waehrung_A);
  LaWEnde1.Caption := 'Dollar (Vereinigte Staaten)';
  LaWEnde2.Caption := 'Dollar (Vereinigte Staaten)';
end;

procedure TFWaehrungen.Bt1PfundClick(Sender: TObject);
begin
  Waehrung_A := 80755;
  EdWaehrungB.Text := FloatToStr(StrToFloat(EdWaehrungA.Text) * (Waehrung_B Div Waehrung_A));
  EdKurs.Text := FloatToStr(Waehrung_B Div Waehrung_A);
  LaWAnfang.Caption := 'Pfund (Großbritannien)';
  LaKurs.Caption := 'Pfund (Großbritannien) =';
  LaKurs.Left := 190 - LaKurs.Width;
end;

procedure TFWaehrungen.Bt2PfundClick(Sender: TObject);
begin
  Waehrung_B := 80755;
  EdWaehrungB.Text := FloatToStr(StrToFloat(EdWaehrungA.Text) * (Waehrung_B Div Waehrung_A));
  EdKurs.Text := FloatToStr(Waehrung_B Div Waehrung_A);
  LaWEnde1.Caption := 'Pfund (Großbritannien)';
  LaWEnde2.Caption := 'Pfund (Großbritannien)';
end;

.
.
.

end.
Und noch andere Währungen (Das ist nur das Schema).

Wie bekomme ich jetzt Komma-Zahlen als Ergebnis,
wenn ich keine Variablen als Float definieren kann
und das Ergebnis (Waehrung_B Div Waehrung_A) anscheinend auch nur als Integer gewertet wird?
(Waehrung_A und Waehrung_B sind das einzige Problem,
sonst funktioniert alles.)
Danke im Vorraus

P.S.: Eine Bild des Programms ist bei den Anhängen. Den rechten Teil bitte ignorieren, das wird erst später eingebaut.

Mit freundlichen Grüßen, Don Muhkuh
Angehängte Grafiken
Dateityp: jpg Programm.jpg (28,9 KB, 6x aufgerufen)

Geändert von Don Muhkuh (13. Okt 2012 um 22:16 Uhr) Grund: Anhang hinzugefügt
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#2

AW: Variable als Float definieren

  Alt 13. Okt 2012, 22:14
Für Währungen gibt es extra ein Variablentyp, das ist der Currency.

Im Gegensatz zu anderen Realtypen hat er keine Rundungsfehler. Das ist wie ein Integer mit vier Nachkommastellen.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Variable als Float definieren

  Alt 13. Okt 2012, 22:49
Es gibt für Fließkommazahlen aber auch double, single, extended um ein paar zu nennen.
Der Currency Typ ist intern ein Int64 wo die letzten vier Stellen als Nachkommastellen betrachtet werden. Ist aber soweit egal, denn das passiert intern. Bei kleinen Werten und Währungen mit großem Umrechnungsfaktor kann allerdings beim Umrechnen auch mal 0,0000 herauskommen.

Nimmt man die anderen Typen (z.B. Extended) wird es auch nicht viel besser, denn hier kommen auch noch üble Rechenungenauigkeiten rein (liegt an der internen Abbildung der Werte)

Man sollte es wissen, um sich darauf einstellen zu können, welchen Tod man stirbt.

Buchhaltärisch reicht Currency (in 90% der Fälle) völlig aus, allerdings werden dort auch beide Werte (In Fremd- und Buchwährung) gespeichert
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Variable als Float definieren

  Alt 13. Okt 2012, 22:54
Wie bekomme ich jetzt Komma-Zahlen als Ergebnis,
wenn ich keine Variablen als Float definieren kann
und das Ergebnis (Waehrung_B Div Waehrung_A) anscheinend auch nur als Integer gewertet wird?
Und warum kannst du keine Variablen als "Float" definieren? Den Datentyp "Float" gibt es nicht, ja. Dafür aber ein Haufen andere, die das bieten, was du suchst: Double, Real, Single, Extended. War das etwa schon das Problem?
  Mit Zitat antworten Zitat
Don Muhkuh

Registriert seit: 13. Okt 2012
4 Beiträge
 
Delphi 7 Personal
 
#5

AW: Variable als Float definieren

  Alt 13. Okt 2012, 23:03
Danke für die schnelle Antwort, aber welchen Befehl (bzw. veränderte Form von FloatToStr und StrToFloat) muss ich benutzen?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Variable als Float definieren

  Alt 13. Okt 2012, 23:13
Danke für die schnelle Antwort, aber welchen Befehl (bzw. veränderte Form von FloatToStr und StrToFloat) muss ich benutzen?
Häh? Schau doch mal nach, was Delphi-Referenz durchsuchenStrToFloat bzw. Delphi-Referenz durchsuchenFloatToStr rausgibt - oh, es gibt eine Doku
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#7

AW: Variable als Float definieren

  Alt 13. Okt 2012, 23:25
An für sich ist es nett, dass man einen Anfänger drauf hinweist, dass es auch Double, Real, Single, Extended Typen gibt, aber wenn er von Währungen spricht, wozu die Info? Das ist wie einem der in der Wüste kurz vor dem verdursten steht und "Wasser" ruft, zu antworten "Ich hätte das Apollinaris, Volvic, Fiji Water, Staatlich Fachingen und Perrier. Welches möchten sie den haben?".
  Mit Zitat antworten Zitat
Don Muhkuh

Registriert seit: 13. Okt 2012
4 Beiträge
 
Delphi 7 Personal
 
#8

AW: Variable als Float definieren

  Alt 13. Okt 2012, 23:27
Da kommt dann der der Fehler, dass der Operator auf den Operandentypen nicht anwendbar sei.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#9

AW: Variable als Float definieren

  Alt 13. Okt 2012, 23:33
Glaube ich nicht.
Delphi-Quellcode:
var
  Geld: Currency;
  Str: String;
begin
  Geld := 123456789.1234;
  ShowMessage(FloatToStr(Geld));

  Str := '123456789,1234'; //hier Komma
  Geld := StrToFloat(Str);
  ShowMessage(FloatToStr(Geld));
end;
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Variable als Float definieren

  Alt 13. Okt 2012, 23:35
Logisch, denn DIV geht nur bei Integer

Nimm stattdessen /
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz