Autor Beitrag
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Fr 15.12.06 22:30 
user profile iconMarc. hat folgendes geschrieben:
Bei mir 7 ;). Da hast du was falsch gemacht.


Nene, 24236.12345 ergibt bei mir z.B. 15. Da ist keinerlei Kausalität drin zu entdecken. :lol: Das stimmt so nicht. Was ist mit meiner Funktion ? Geht die etwa nicht ?

_________________
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:34 
Delphi hat es nicht so mit rechnen (EDIT: Hier stand Schwachsinn) und umwandeln in einen String bringt auch Probleme, wegen der Darstellung 1,32E-10.

Z.B. funktioniert das hier gut:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  X: Extended;
  Y: Extended;
begin
  X := 4.000132;
  X := Frac(X);
  Y := FracToInt(X);
  Y := Power(10, Y) * X;

Aber mit X = 4.0000132; schon nicht mehr.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)


Zuletzt bearbeitet von GTA-Place am Sa 16.12.06 09:44, insgesamt 1-mal bearbeitet
herby Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 21



BeitragVerfasst: Fr 15.12.06 22:39 
@hansa na ja... stimmen schon. Aber du machst ja schliesslich die Nachkommastellen-Eruierung auch über ne StringUmwandlung mit Pos (bei der jedoch der länderspezifische DecimalSeperator nicht bedacht ist.

da ists dann zu meiner "Ursprungsvriante" die dazu noch den RechtsCopy des (da nun eh schon vorhandenen ungewünschten) Strings macht nicht mehr weit. ...und wie GTA-Place schon sagte ist mir diese StringUmwandlung selber auch ein Dorn im Auge, darum such ich ja nach einer arithmetischen Variante

...hmm scheint Kowalski hat da auch nichts passendes in seinen (ansonsten perfekten) Kochbüchern :(
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Fr 15.12.06 23:05 
Hallo,

dort (Link) hat alzaimar in der DP mal etwas gepostet.

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
herby Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 21



BeitragVerfasst: Fr 15.12.06 23:27 
auch ne veriante - danke für den Link

Nur leider gibts ab bestimmten Werten Rundungsdifferenzen :( (egal wie hoch man dann die constante ccMaxDigits dreht)
im Beispiel unten kommt zB. 12345677999999 raus statt 12345678. Die fixe Constante ist nicht unbedingt mein fall ebenso das hier auch eine Schleife durchgerattert wird (aber mit dem könnt ich jedoch noch leben)

hier mal die Function von alzaimar:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
Function ExractFractionalPart (aValue : Extended) : Int64;
Const
  ccMaxDigits = 100000000000000; // Weiss nicht, ob das reicht
Begin
  Result := Trunc (ccMaxDigits * Frac(aValue)); // z.b. : 1.23 => 230000000
  While (Result>0) And (Result mod 10 = 0) do  // Solange <>0 und die letzte Stelle 0 ist, wegschnippeln
    Result := Result div 10;
End;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Showmessage(IntToStr(ExractFractionalPart(2456.12345678)));
end;


aber ich hab jetzt schon jede Menge Denkanstösse für bekommen - glaub dass ich mir da jetzt was zusammenschustern kann
Danke nochmal euch allen für eure Zeit
eruhenon
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 53



BeitragVerfasst: Fr 15.12.06 23:38 
user profile iconherby hat folgendes geschrieben:
@hansa na ja... stimmen schon. Aber du machst ja schliesslich die Nachkommastellen-Eruierung auch über ne StringUmwandlung mit Pos (bei der jedoch der länderspezifische DecimalSeperator nicht bedacht ist.


nur mal so als frage aber passt sich das dann nicht an?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var     zahl:real;
        st:string;
begin
        zahl:=1.067843214;
        st:=floattostr(zahl);
        delete(st,1,pos(DecimalSeparator,st));
        while st[1]='0' do delete(st,1,1);
        label1.Caption:=st;
end;
herby Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 21



BeitragVerfasst: Fr 15.12.06 23:51 
user profile iconeruhenon hat folgendes geschrieben:
nur mal so als frage aber passt sich das dann nicht an?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var     zahl:real;
        st:string;
begin
        zahl:=1.067843214;
        st:=floattostr(zahl);
        delete(st,1,pos(DecimalSeparator,st));
        while st[1]='0' do delete(st,1,1);
        label1.Caption:=st;
end;


doch, so schon. (weiss jetzt nicht wo dein code herkommt) Nur wenn man fix nach einem Beistrich sucht wie's in dem obigen Beispiel der Fall war
Zitat:
length (st) - pos (',',st);
wird man womöglich auf anderen Maschinen einfahren. Wenn jedoch die DecimalSeparator variable verwendet wird (wie in deinem Beispiel) sollte eigentlich das Dezimalzeichen auch das sein welches auf der Machine eingestellt ist.

...aber wie gesagt, ich möchte ja dieser "String-Wurschtlerei" aus dem Wege gehen. ...da gabs hier schon einige gute mathematische Ansätze aus denen ich mir sicher was bauen kann.
eruhenon
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 53



BeitragVerfasst: Fr 15.12.06 23:57 
ich hab das nur kurz selbst geschrieben und die variable hab ich irgentwo in einem der vorherigen beiträge gesehn...

wenn ich das aber richtig sehe wird bei der mathematik allerdings immer eine gewisse tolleranz vorhanden sein.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Sa 16.12.06 02:34 
user profile iconeruhenon hat folgendes geschrieben:
...wenn ich das aber richtig sehe wird bei der mathematik
allerdings immer eine gewisse tolleranz vorhanden sein.


Du bist in dieser Richtung völlig auf dem falschen Weg. In Richtung Mathematik ist wirklich nichts zu machen. Von wegen Toleranz. Zahl ist Zahl und Basta. Rien ne va plus 8)

_________________
Gruß
Hansa
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Sa 16.12.06 10:14 
user profile iconherby hat folgendes geschrieben:
Nur leider gibts ab bestimmten Werten Rundungsdifferenzen :( (egal wie hoch man dann die constante ccMaxDigits dreht)
im Beispiel unten kommt zB. 12345677999999 raus statt 12345678.


Das dürfte hieran liegen (ist ein sehr ähnliches Problem).