Automatische Rundung einer 10-st Zahl
Moderator: Moderatoren
Automatische Rundung einer 10-st Zahl
Hi!
Hier habe ich noch zum Jahresende eine kleine Nuss zu kancken:
Ich möchte eine 10 st. Personalnummer wie folgt einlesen:
public persnr1
store 0 to persnr1
@ 10,10 get persnr1 picture "##########" valid (persnr1 >= 0)
Sobald diese Zahl größer als 2.147.450.897 ist, wird diese automatisch auf 9 Stellen gerundet: 214.749.090!
Kleinere Zahlen werden richtig 10-stellig weiterverarbeitet, größere dagegen immer auf 9 Stellen gerundet.
Das kann doch wohl nicht wahr sein?
Gruß Werner
Hier habe ich noch zum Jahresende eine kleine Nuss zu kancken:
Ich möchte eine 10 st. Personalnummer wie folgt einlesen:
public persnr1
store 0 to persnr1
@ 10,10 get persnr1 picture "##########" valid (persnr1 >= 0)
Sobald diese Zahl größer als 2.147.450.897 ist, wird diese automatisch auf 9 Stellen gerundet: 214.749.090!
Kleinere Zahlen werden richtig 10-stellig weiterverarbeitet, größere dagegen immer auf 9 Stellen gerundet.
Das kann doch wohl nicht wahr sein?
Gruß Werner
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Automatische Rundung einer 10-st Zahl
da du 3 Stellen hinter dem Komma hastWerner hat geschrieben:Kleinere Zahlen werden richtig 10-stellig weiterverarbeitet, größere dagegen immer auf 9 Stellen gerundet.
Code: Alles auswählen
SET DECIMALS TO 3
gruss by OHR
Jimmy
Jimmy
- Jan
- Marvin
- Beiträge: 14653
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Automatische Rundung einer 10-st Zahl
Jimmy,
wo sind da drei Stellen hinter welchem Komma?
Jan
wo sind da drei Stellen hinter welchem Komma?
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Re: Automatische Rundung einer 10-st Zahl
Hallo Werner
im Notfall mache die Eingabe über String:und schaue was rauskommt.
Habe in allen Programmen Set( _SET_DECIMALS , 16 ) - aber ob das was an Deinem Problem ändert...?
im Notfall mache die Eingabe über String:
Code: Alles auswählen
cPersNr1 := PadL( Str( nPersNr1 , 10 ) , 10 )
@ Get nX,nY Get cPersNr1 Picture "##########" Valid Val( cPersNr1 ) >= 0
Read
Clear Gets
nPersNr1 := Val( AllTrim( cPersNr1 ) )
(Code nicht getestet...)
Habe in allen Programmen Set( _SET_DECIMALS , 16 ) - aber ob das was an Deinem Problem ändert...?
- Jan
- Marvin
- Beiträge: 14653
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Automatische Rundung einer 10-st Zahl
Hallo Werner,
zwei Fragen dazu:
zwei Fragen dazu:
- Warum ist die Variable PUBLIC? Könnte die eventuell mit einer PUBLIC mit gleichem Namen irgendwie kollidieren? Hab ich leider schon erlebt.
- Warum Picture #? Wenn das doch sowieso nur mumerische werden soll, würde ich die 9 nehmen.
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Automatische Rundung einer 10-st Zahl
em ... äh ... Punkt aber kein Komma ...Jan hat geschrieben:wo sind da drei Stellen hinter welchem Komma?
gruss by OHR
Jimmy
Jimmy
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Automatische Rundung einer 10-st Zahl
nun wollte ich es wissen und habe diesen vollständigen CodeWerner hat geschrieben:Sobald diese Zahl größer als 2.147.450.897 ist, wird diese automatisch auf 9 Stellen gerundet: 214.749.090!Code: Alles auswählen
public persnr1 store 0 to persnr1 @ 10,10 get persnr1 picture "##########" valid (persnr1 >= 0)
Code: Alles auswählen
PROCEDURE MAIN
LOCAL persnr1 := 2147450897+100
@ 10,10 get persnr1 picture "##########" valid (persnr1 >= 0)
READ
CLEAR GETS
? persnr1
WAIT
RETURN
gruss by OHR
Jimmy
Jimmy
- Herbert
- Der Entwickler von "Deep Thought"
- Beiträge: 1991
- Registriert: Do, 14. Aug 2008 0:22
- Wohnort: Gmunden am Traunsee, Österreich
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Automatische Rundung einer 10-st Zahl
Du gelangst an die 4-Byte-Grenze (0 bis 4294967296), wenn du die auch Minus tolerierst die Hälfte bei 2147483648.
Warum dann schon bei 2.147.450.897 Ungenaues kommt, ist nicht ganz klar. Aber der "Fehler" ist da zu suchen.
Warum dann schon bei 2.147.450.897 Ungenaues kommt, ist nicht ganz klar. Aber der "Fehler" ist da zu suchen.
Grüsse Herbert
Immer in Bewegung...
Immer in Bewegung...
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9361
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 101 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: Automatische Rundung einer 10-st Zahl
Ich würde für Personalnummern und ähnliche Merkmale nie die numerische Repräsentation wählen, sondern immer die als Zeichenkette(n). Gerade bei sehr langen teilnumerischen Merkmalen (bsp. IBANs) erleichtert es das spätere Lesen ungemein, wenn man Trennzeichen (Leerzeichen, Punkte, Bindestriche usw.) eingeben kann. Über eine entsprechende Picture-Klausel lässt sich das bequem steuern. Davon abgesehen gibt es in solchen Bereichen nicht selten Merkmale mit führenden Nullen, die sich als numerische Werte überhaupt nicht darstellen lassen.
Herzlich,
Tom
Tom