Autor |
Beitrag |
herby
      
Beiträge: 21
|
Verfasst: 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
      
Beiträge: 194
XP /XP PRO/ SuSE div.
D1 - D7, BDS 2006
|
Verfasst: Fr 15.12.06 20:09
Dein Operator ist mod,
F1 ist Dein friend...
Moin
|
|
herby 
      
Beiträge: 21
|
Verfasst: 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 
Zuletzt bearbeitet von herby am Fr 15.12.06 20:39, insgesamt 1-mal bearbeitet
|
|
zongo-joe
      
Beiträge: 134
win xp prof
D3, D4, D7
|
Verfasst: 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
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Fr 15.12.06 20:38
Es geht z.B.:
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
      
Beiträge: 134
win xp prof
D3, D4, D7
|
Verfasst: 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 
      
Beiträge: 21
|
Verfasst: Fr 15.12.06 21:14
Ich hab befürchtet das dies nicht ohne Schleife geht.
meine Not-Lösung sieht so aus 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
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Fr 15.12.06 21:23
|
|
GSE
      
Beiträge: 740
Win 2k, Win XP Pro
D5 Prof, D6 Ent, D2k5 PE
|
Verfasst: 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 
      
Beiträge: 21
|
Verfasst: Fr 15.12.06 21:43
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Fr 15.12.06 21:43
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 
      
Beiträge: 21
|
Verfasst: Fr 15.12.06 21:57
@GTA-Place:
ich hab das mal probiert mit
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
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: 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
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: 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 :
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 public 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. 
_________________ Gruß
Hansa
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Fr 15.12.06 22:07
Warum so kompliziert?
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 
      
Beiträge: 21
|
Verfasst: Fr 15.12.06 22:17
Marc. hat folgendes geschrieben: | Warum so kompliziert?
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
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Fr 15.12.06 22:17
Bei der Koblenzer Sache hier :
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.
Und bei meinem Beispiel gibts Rundungsdifferenzen in der Power Zeile. Die sind so allerdings nicht mehr zu bemerken :
Delphi-Quelltext 1:
| showmessage (IntToStr (round (f * power (10,p)))); |
Vielleicht gehts auch ohne round mit anderem Zahlentyp. So, genug gespielt. 
_________________ Gruß
Hansa
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: 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.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: 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. |
Bei mir 7  . Da hast du was falsch gemacht.
|
|
herby 
      
Beiträge: 21
|
Verfasst: 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
|
|