Autor Beitrag
herby
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 21



BeitragVerfasst: Fr 15.12.06 19:18 
hi,

gibt es eigentlich eine Funktion um den Nachkommaanteil als Ganzzahl zu ermitteln?

soll heissen
12.33 --> 33
0.1234 --> 1234
usw..

mit frac bekomm ich ja schon mal den Nachkommaanteil in Form 0.33 bzw 0.1234
über die Anzahl der Kommastellen könnte man ermitteln wie oft mit 10 multipliziert werden muss.
...aber zuerst müsste man mal die Anzahl der Kommastellen rauskriegen.

hmm...Ich gehe das ganze vermutl. vieeeel zu kompliziert an.
Gibt es da vielleicht nicht schon eine fertige math. Funktion?

danke für jede Hilfe

---------
Jetzt momentan mach ich als Notlösung eine FloatToStr und suche mir über die Pos des DecimalSeparator den hinteren Teil und dann zurück als Integer. Naja... nicht gerade sehr schön :? ...
stifflersmom
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194

XP /XP PRO/ SuSE div.
D1 - D7, BDS 2006
BeitragVerfasst: Fr 15.12.06 20:09 
Dein Operator ist mod,
F1 ist Dein friend...

Moin
herby Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 21



BeitragVerfasst: Fr 15.12.06 20:30 
hi, danke erstmal für die rasche Antwort

Zitat:
Der Operator mod liefert den Rest, der sich bei der Division seiner Operanden ergibt. Das bedeutet: x mod y = x – (x div y) * y. wobei x und y integerwerte darstellen.

hmm... weiss jetzt leider nicht genau wie mir das weiterhelfen soll.
die übergabewerte sind Integer. soll das heissen ich muss zuerst alles hochmultiplizieren?
wobei wir wieder bei der Frage sind mit was?? (anzahl der nachkommastellen können sich ja ändern)

wie könnte ich denn mod einsetzen zB. bei 0.1234 (etwa 1234 mod 10000 ? - das gibt -2.092) weiss da nicht genau was in meinem Fall die Operanden eigentlich wären.

tschuldigung.. ich bring das noch nicht ganz auf die Reihe :oops:


Zuletzt bearbeitet von herby am Fr 15.12.06 20:39, insgesamt 1-mal bearbeitet
zongo-joe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 134

win xp prof
D3, D4, D7
BeitragVerfasst: Fr 15.12.06 20:36 
wenns nur um die Anzahl der Nachkommastellen geht:
so ausm Kopf:

anzahlNachkommastellen := length(floattostr(zahl-trunc(zahl)))-2;

auch keine elegante Lösung, sollte aber funzionieren
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Fr 15.12.06 20:38 
Es geht z.B.:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
Nachkomme:=0;
while frac(YourNumber)>0 do
begin
  inc(Nachkomme);
end;


PS: Mod dürfte ungeeignet sien, da mod IMHO nur mit Ganzzahl umgehen kann
zongo-joe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 134

win xp prof
D3, D4, D7
BeitragVerfasst: Fr 15.12.06 20:42 
@Heiko: ich fürchte das ist ne endlosschleife, YOURNUMBER ändert sich ja nicht, oder steh ich da auffer Leitung ?
herby Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 21



BeitragVerfasst: Fr 15.12.06 21:14 
Ich hab befürchtet das dies nicht ohne Schleife geht. :(

meine Not-Lösung sieht so aus
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function FracToInt(d: double): integer;
var s: string;
    p: integer;
begin
  s := Floattostr(d);
  p := pos(DecimalSeparator,s);
  if p > 0 then
    result := StrToIntDef(copy(s,p+1,length(s)-p),0)
  else result := 0;
end;


na ja.. wie gesagt.. nicht so richtig elegant;
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Fr 15.12.06 21:23 
user profile iconzongo-joe hat folgendes geschrieben:
@Heiko: ich fürchte das ist ne endlosschleife, YOURNUMBER ändert sich ja nicht, oder steh ich da auffer Leitung ?

Jupp, vergessen ;).

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
Nachkomme:=0;
while frac(YourNumber)>0 do
begin
  inc(Nachkomme);
  YourNumber:=YourNumber*10;
end;
GSE
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 740

Win 2k, Win XP Pro
D5 Prof, D6 Ent, D2k5 PE
BeitragVerfasst: Fr 15.12.06 21:32 
wie wär's damit?
mit Pos() die Position des Punkts / Kommas rausfinden und dann einfach Copy ab dort

mfg
GSE

_________________
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs
and the universe trying to produce bigger and better idiots. So far, the universe is winning. (Richard Cook)
herby Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 21



BeitragVerfasst: Fr 15.12.06 21:43 
user profile iconGSE hat folgendes geschrieben:
wie wär's damit?
mit Pos() die Position des Punkts / Kommas rausfinden und dann einfach Copy ab dort

mfg
GSE
Hab ich ja auch oben schon gemacht und gepostet ;)
user profile iconherby hat folgendes geschrieben:
meine Not-Lösung sieht so aus
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function FracToInt(d: double): integer;
var s: string;
    p: integer;
begin
  s := Floattostr(d);
  p := pos(DecimalSeparator,s);
  if p > 0 then
    result := StrToIntDef(copy(s,p+1,length(s)-p),0)
  else result := 0;
end;


na ja.. wie gesagt.. nicht so richtig elegant;


@heike - danke, hmm... aber wenn ich da eh durch die Kommastellen durchsteppen muss, kann ich vermutl.auch bei meiner variante über die StringUmwandlung bleiben. ...komisch ich dachte da gabs mal ne arithmetische function für.. vielleicht find ich ja noch was.

Danke auf jeden Fall für eure Hilfe
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Fr 15.12.06 21:43 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
uses
  Math;

// ...
 
var
  X: Extended;
begin
  X := 4.000132;
  X := Frac(X);
  X := X * Power(10, Length(FloatToStr(X))) / 100;

Gibt X = 132 aus.

[Warnung: Vorläufig und in kurzer Zeit erstelle Funktion, enthält Fehler ab bestimmter Anzahl Nachkommastellen, wird noch verbessert! Die Stringumwandlung will ich noch wegbekommen.]

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
herby Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 21



BeitragVerfasst: Fr 15.12.06 21:57 
@GTA-Place:
ich hab das mal probiert mit

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
function FracToInt(d: extended): integer;
var
  X: Extended;
begin
  X := Frac(d);
  X := X * Power(10, Length(FloatToStr(X))) / 100;
  result := Trunc(X);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Showmessage(IntToStr(FracToInt(24236.12348)));
end;

Da kommt bei mir bei deiner Variante -309760000 raus (statt 12348) :? :? ...hab ich da was falsch gemacht?
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Fr 15.12.06 22:01 
Kann auch mein Fehler sein, ich probier noch bissl rum.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Fr 15.12.06 22:05 
Was ist nur an den String-Funktionen so schwer ?

Die feste 10 von GTA kann man doch wunderbar eliminieren :

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

uses Math;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var r,
    f : real;
    st : string;
    p : integer;
begin
  st := '1,2345';
  r  := StrToFloat (st);
  f := Frac (r);
  p := length (st) - pos (',',st);
  showmessage (FloatToStr (f * power (10,p)));
end;

end.


Ob das jetzt mit 3978 Dezimalstellen funktioniert glaube ich allerdings nicht. :mrgreen:

_________________
Gruß
Hansa
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Fr 15.12.06 22:07 
Warum so kompliziert?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
function FracToInt(d: extended): integer;
var
  X: Extended;
begin
  X := Frac(d)*10;
  X := Length(FloatToStr(X))-1 ;
  result := Trunc(X);
end;
[...]
begin
  Showmessage(IntToStr(FracToInt(24236.12345)));
end;
[...]

marc
herby Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 21



BeitragVerfasst: Fr 15.12.06 22:17 
user profile iconMarc. hat folgendes geschrieben:
Warum so kompliziert?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
function FracToInt(d: extended): integer;
var
  X: Extended;
begin
  X := Frac(d)*10;
  X := Length(FloatToStr(X))-1 ;
  result := Trunc(X);
end;
[...]
begin
  Showmessage(IntToStr(FracToInt(24236.12345)));
end;
[...]

marc


hmm.. da kommt jetzt aber bei mir 5 raus (statt 12345) - oder hast du das eher zum eruieren der kommastellen-Anzahl gedacht?

mit dem Functionsnamen FracToInt wollt ich eigentlich ausdrücken das die Function so wie der Topic sagt den Wert hinter der Kommastelle als Ganzzahl zurückgibt (nicht die Anzahl der Kommastellen)


Zuletzt bearbeitet von herby am Fr 15.12.06 22:20, insgesamt 1-mal bearbeitet
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Fr 15.12.06 22:17 
Bei der Koblenzer Sache hier :

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Button1Click(Sender: TObject);
var
  X: Extended;
  st : string;
  d : real;
begin
  d := 1.0002345;
  X := Frac(d)*10;
  X := Length(FloatToStr(X))-1 ;
  Showmessage(FloatToStr(Trunc (x)));
end;


kommt bei mir 18 raus. :shock:

Und bei meinem Beispiel gibts Rundungsdifferenzen in der Power Zeile. Die sind so allerdings nicht mehr zu bemerken :

ausblenden Delphi-Quelltext
1:
showmessage (IntToStr (round (f * power (10,p))));					


Vielleicht gehts auch ohne round mit anderem Zahlentyp. So, genug gespielt. :mrgreen:

_________________
Gruß
Hansa
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Fr 15.12.06 22:18 
Marc: Du musst schon lesen, was er will. Da kommt 5 raus ;-).

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Fr 15.12.06 22:19 
Zitat:
...aber zuerst müsste man mal die Anzahl der Kommastellen rauskriegen.

-> Deine Funktion abgeändert ergab meine.

Zitat:
kommt bei mir 18 raus. :shock:

Bei mir 7 ;). Da hast du was falsch gemacht.
herby Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 21



BeitragVerfasst: Fr 15.12.06 22:30 
ja.. dann wärs aber wieder 2x über den sattel gezogen

zuerts marcs Funktion zum eruieren der Kommastellen. und danach müsst ich dann noch die Frac(24236.12345) welche 0.12345 ergiebt nachKommastellenMal mit 10 multiplizieren damit ich dann wieder auf die Ganzahl der Nachkommassumme komme. (naja... dann doch lieber die StringUmwandlung mit Copy ab Komma) .. ich dachte eigentlich da war mal ne arithmetische Funktion die das in einem einzigen Rutsch erledigte ...bin gerade auch noch meine "Kochbücher" am studieren ...vielleicht find ich da noch was


Zuletzt bearbeitet von herby am Fr 15.12.06 22:31, insgesamt 1-mal bearbeitet