Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi zahl runden (https://www.delphipraxis.net/99710-zahl-runden.html)

MasterTobi 16. Sep 2007 14:54


zahl runden
 
hey

warum sagt mir edit1.text '2' wenn ich den code benutze
Delphi-Quellcode:
var

  a,c:string;
  b:integer;
  x:extended;
begin
  a:=edit1.text;
  x:=strtofloat(a);
  x:= round(2) ;
  c:=floattostr(x);
  edit1.Text:=c;
ich möchte doch nur die zahl in edit1.text runden auf '2' stellen
un dann wieder in edit1.text ausgeben?!

mkinzler 16. Sep 2007 14:58

Re: zahl runden
 
Zitat:

warum sagt mir edit1.text '2' wenn ich den code benutze
Weil du die Zahl 2 rundest.
Du scheinst das Prinzip der Zuweisung nicht zu verstehen.
Der linken Seite wird zugewiesen. Dein Code sagt also nimm die Zahl 2 runde diese und weise sie x zu.

MasterTobi 16. Sep 2007 15:07

Re: zahl runden
 
hm stimmt *g*
wenn ich aber jetzt sage
Delphi-Quellcode:
x:=round(edit1.text)
[Fehler] Unit2.pas(248): E2008 Inkompatible Typen
oder bei anderen buchstaben dennen ich edit1.text zuweiße

hm komisch

mkinzler 16. Sep 2007 15:08

Re: zahl runden
 
Round will ja auch eine Fließkommazahl als Parameter
Delphi-Quellcode:
x:=round(StrToFloat(edit1.text));
Wobei TryStrToFloat oder ein try..except Block sinnvoll wäre.

MasterTobi 16. Sep 2007 15:21

Re: zahl runden
 
ok danke das funzt
war ich ja knapp dran :cheers:

noch ne blöde frage
bei 3,45 rundet er ab aber ich will das da dann 4 steht, fragt bitte net warum muss einfach so sein:-D

inherited 16. Sep 2007 15:23

Re: zahl runden
 
x2:=round(x*10) / 10

alleinherrscher 16. Sep 2007 15:31

Re: zahl runden
 
Zitat:

noch ne blöde frage
bei 3,45 rundet er ab aber ich will das da dann 4 steht, fragt bitte net warum muss einfach so sein:-D

Hä:

Das hier:

Zitat:

Delphi-Quellcode:
 x2:=round(x*10) / 10

Rundet ja wohl auf der erste nachkommastelle...

Das will er aber doch gar nicht...

So geht das:

Delphi-Quellcode:
round(zahl+0.5);
mfg

Neutral General 16. Sep 2007 15:32

Re: zahl runden
 
:arrow: stell dir das ganze so vor:

auf der linke Seite vom ':=' hast du eine Kiste. In diese Kiste kannst du was reintun. Es gibt verschiedene Arten von Kisten. Zum Beispiel welche in die nur Strings reinpassen und andere in die nur ganze Zahlen (Integers) reinpassen. In andere passen auch Kommazahlen (Real, Single, Double, Extended) rein. Wenn was in eine Kiste rein soll das eigentlich nicht reinpasst musst du es passend machen.

Beispiel: Du hast eine Integer (Ganzzahlen) Kiste. Und willst die "Zahl" reintun die in einem Edit drinsteht. Dann musst du während du die Zahl ausm Edit darein tust erst den String so bearbeiten das er in die Integer-Kiste passt. Dazu kramst du in deiner Werkzeugkiste und findest Delphi-Referenz durchsuchenStrToInt.

In Delphi:

Delphi-Quellcode:
var IntKiste: Integer;
begin
  IntKiste := StrToInt(Edit1.Text);
end;
Diese Werkzeuge sind Funktionen. Eine Funktion gibt immer etwas zurück. Funktionen sind sowas wie Automaten. Man gibt was bestimmtes rein (nicht alles passt in den Eingang. Ähnlich wie bei den Kisten) und der Automat/Die Funktion macht was damit und gibt was raus:
Delphi-Quellcode:
Eingabe           Ausgabe
--------> AUTOMAT -------->
In Delphi sieht das so aus:

Delphi-Quellcode:
function <Name des "Automaten"> (Eingaben: Varibalentyp): Ausgabetyp;
Das gehört vielleicht jetzt nicht alles zur Beantwortung deiner Frage aber vielleicht verstehst du jetzt son bisschen wie das Prinzip von Delphi und eigentlich allen (höheren) Programmiersprachen ist.

Delphi-Quellcode:
var
  a,c:string;
  b:integer;
  x:extended;
begin
  a:=edit1.text;
  x:=strtofloat(a);
  x:= round(2) ;
  c:=floattostr(x);
  edit1.Text:=c;
übersetzen wir das doch mal in die "Kistensprache"

du hast 4 Kisten. Zwei Stringkisten, eine Ganzzahlkiste und eine Kommazahlkiste.

Delphi-Quellcode:
var
  a,c:string;
  b:integer;
  x:extended;
In die erste Stringkiste tust du den Text des Edits.

Delphi-Quellcode:
a:=edit1.text;
:arrow: Völlig in Ordnung (jedoch nicht nötig wie ich gleich zeigen werde)

Dann nimmst du ein Werkzeug (= Automat=Funktion), bearbeitest das Objekt in deiner Stringkiste so das es in die Kommazahlkiste passt und tust es darein.

Delphi-Quellcode:
x:=strtofloat(a);
:arrow: Auch in Ordnung aber schüttest du Wasser bevor du es in den Kochtopf tust nochmal extra vorher in ein anderes Gefäß und schüttest dann um? Was ich sagen will: Es GEHT auch direkter. Das ist kein Zwang aber es ist schneller und praktischer:

Delphi-Quellcode:
x:=strtofloat(Edit1.Text);

// statt

a:=edit1.text;
x:=strtofloat(a);
Dann nimmst du die Kommazahlkiste in die du eben (über einen Umweg) die Zahl ausm Edit reingetan hast und tust da eine gerundete 2 rein. Denn Round ist ein Werkzeug das aus einer (Kommazahl) eine Ganzzahl macht. Das heißt aus
2,3564 macht Round eine 2. Aus 2 macht Round auch eine 2.

:arrow: Mit dieser Zeile werden alle vorherigen Schritte, die ja korrekt waren, sinnlos gemacht. Das ist als hättest du Wasser in eine Schüssel getan, das Wasser in den Kochtopf getan, das Wasser im Kochtopf ausgeschüttet und in den Kochtopf Salz reingeschüttet.

Jetzt nimmst du die (gerundete) 2 die du eben in die Kommazahlkiste getan hast und bearbeitest sie so das sie in eine Stringkiste passt und tust sie in eine Stringkiste.

Delphi-Quellcode:
c:=floattostr(x);
Als nächstes tust du die 2 die mittlerweile in einer Stringkiste liegt in die Stringkiste des Edits.
:arrow: Die 2 wird angezeigt.

Den ganzen Vorgang in Kochtopfsprache:
Du füllst Wasser in ein Gefäß, gießt das Wasser aus dem Gefäß in den Kochtopf. Schüttest das Wasser aus dem Kochtopf in den Abfluss und tust gleichzeitig Salz rein. Das Salz aus dem Kochtopf tust du auf nen Teller und isst es dann.

Hört sich bescheuert an oder?^^

Wie wärs wenn dus so machst:

Du trinkst das wasser während du es mit dem Salzstreuer salzt :mrgreen:

Das ist der kürzeste Weg der dich zum Ziel führt ;)

In Delphi:
Delphi-Quellcode:
begin
  Edit1.Text := FloatToStrF(StrToFloat(Edit1.Text),ffNumber,2,2);
end;
Oder wenn du aus nem Teller/Glas essen/trinken willst:

Delphi-Quellcode:
var
 f: Single;
begin
 f := StrToFloat(Edit1.Text);
 Edit1.Text := FloatToStrF(f,ffNumber,2,2);
end;
Solltest du das jetzt alles gelesen haben, müsstest du langsam anfangen zu verstehn wie alles läuft oder ?^^

Gruß
Neutral General

EDIT: Rechtschreib- und Flüchtigkeitsfehler verbessert.

dominikkv 16. Sep 2007 15:32

Re: zahl runden
 
Zitat:

Zitat von inherited
x2:=round(x*10) / 10

dann kommt aber 3.5 raus^^
vllt so:
Delphi-Quellcode:
x2:=round(round(x*10) / 10)

alleinherrscher 16. Sep 2007 15:34

Re: zahl runden
 
Zitat:

Zitat von dominikkv
Zitat:

Zitat von inherited
x2:=round(x*10) / 10

dann kommt aber 3.5 raus^^
vllt so:
Delphi-Quellcode:
x2:=round(round(x*10) / 10)

Ne, nochmal (siehe oben):

Delphi-Quellcode:
x2:=round(x+0.5);

MasterTobi 16. Sep 2007 15:37

Re: zahl runden
 
ja hab ich
ich muss noch sagen das ich noch nicht so lange in delphi programmier
aber des war hamma wie du das erklärt hast
vielen dank

Neutral General 16. Sep 2007 15:39

Re: zahl runden
 
Zitat:

Zitat von MasterTobi
ja hab ich
ich muss noch sagen das ich noch nicht so lange in delphi programmier
aber des war hamma wie du das erklärt hast
vielen dank

Danke aber es muss

Delphi-Quellcode:
begin
  Edit1.Text := FloatToStrF(StrToFloat(Edit1.Text),ffNumber,2,2);
end;
heißen. Hatte eben zuerst

Delphi-Quellcode:
begin
  Edit1.Text := FloatToStrF(FloatToStr(Edit1.Text),ffNumber,2,2);
end;
da stehn...

Gruß
Neutral General

MasterTobi 16. Sep 2007 15:42

Re: zahl runden
 
ok ok ok
danke @ all

aber sry mein prob is noch net gelöst
ich will ja wenn 3,45 da steht trozdem das da 4 steht
bei 3,5 steht ja 4

:gruebel:

dominikkv 16. Sep 2007 15:43

Re: zahl runden
 
Zitat:

Zitat von alleinherrscher
Zitat:

Zitat von dominikkv
Zitat:

Zitat von inherited
x2:=round(x*10) / 10

dann kommt aber 3.5 raus^^
vllt so:
Delphi-Quellcode:
x2:=round(round(x*10) / 10)

Ne, nochmal (siehe oben):

Delphi-Quellcode:
x2:=round(x+0.5);

ô_0 das hab ich garnet gesehen^^
geht natürlich auch, deine methode wird aber schneller sein :zwinker:

Neutral General 16. Sep 2007 15:45

Re: zahl runden
 
Hi,

Zur Hilfe:

Delphi-Quellcode:
Edit1.Text := IntToStr(Ceil(3.212));
Gruß
Neutral General

MasterTobi 16. Sep 2007 15:49

Re: zahl runden
 
ok danke
jetzt hab ich´s
Delphi-Quellcode:
  x:=round(strtofloat(edit1.text)+0.5);

silver-moon-2000 16. Sep 2007 15:50

Re: zahl runden
 
Zitat:

Zitat von MasterTobi
ok ok ok
danke @ all

aber sry mein prob is noch net gelöst
ich will ja wenn 3,45 da steht trozdem das da 4 steht
bei 3,5 steht ja 4

:gruebel:

Korrigiert mich, wenn ich falsch liege, aber ich würde hier

Delphi-Quellcode:
x2 := ceil(x);
verwenden.
Ceil rundet immer auf die nächste zahl auf. Natürlich muss man dabei noch die Unit "math" in die uses-Klausel aufnehmen.

Apollonius 16. Sep 2007 16:13

Re: zahl runden
 
Die +0,5-Variante haut bei ganzen Zahlen nicht hin: Da wird dann 4 auf 5 gerundet, was wohl nicht Absicht ist.

dominikkv 16. Sep 2007 16:14

Re: zahl runden
 
na dann halt +0.05

Neutral General 16. Sep 2007 16:25

Re: zahl runden
 
OT: @silver-moon-2000: die Unit math ist für Ceil nicht nötig. Zumindest bei meinem Delphi nicht...

Apollonius 16. Sep 2007 16:29

Re: zahl runden
 
Ähem? Ich dacht hier ginge es allgemein ums Aufrunden. Und dann geht es ohne Verzweigung wohl nicht.

alleinherrscher 16. Sep 2007 16:50

Re: zahl runden
 
Zitat:

Zitat von dominikkv
na dann halt +0.05

Ne das is kappes!

theoretisch dann +0.49999 aber das is nicht sehr schön, das muss ich wohl zugeben...

dominikkv 16. Sep 2007 16:55

Re: zahl runden
 
Zitat:

Zitat von alleinherrscher
Zitat:

Zitat von dominikkv
na dann halt +0.05

Ne das is kappes!

theoretisch dann +0.49999 aber das is nicht sehr schön, das muss ich wohl zugeben...

nö -.-

er will ja

Round(3,44) -> 3
Round(3,45) -> 4

silver-moon-2000 16. Sep 2007 16:55

Re: zahl runden
 
Liste der Anhänge anzeigen (Anzahl: 1)
[OT]

Zitat:

Zitat von Neutral General
OT: @silver-moon-2000: die Unit math ist für Ceil nicht nötig. Zumindest bei meinem Delphi nicht...

Doch: zumindest in TDE.
Beispiel: neues Projekt, darin:
Delphi-Quellcode:
procedure blubb;
var
  x, y : integer;
begin
 x := ceil(y);
end;
Kommt bei mir er Fehler "[Pascal Error] Unit1.pas(27): E2003 Undeclared identifier: 'ceil'"
Außerdem siehe Anhang.

:zwinker: :zwinker: So, jetzt hab ich's Dir aber gegeben

[/OT]

alleinherrscher 16. Sep 2007 17:00

Re: zahl runden
 
Sorry, du hast Recht, Dominikkv.

Aber die Frage ist auch etwas schwammig formuliert ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:32 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