Automatische Rundung einer 10-st Zahl

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Werner
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 120
Registriert: Sa, 18. Mär 2006 16:08

Automatische Rundung einer 10-st Zahl

Beitrag von Werner »

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
Benutzeravatar
AUGE_OHR
Marvin
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

Beitrag von AUGE_OHR »

Werner hat geschrieben:Kleinere Zahlen werden richtig 10-stellig weiterverarbeitet, größere dagegen immer auf 9 Stellen gerundet.
da du 3 Stellen hinter dem Komma hast

Code: Alles auswählen

SET DECIMALS TO 3
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
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

Beitrag von Jan »

Jimmy,

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.
DelUser01

Re: Automatische Rundung einer 10-st Zahl

Beitrag von DelUser01 »

Hallo Werner

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...)
und schaue was rauskommt.
Habe in allen Programmen Set( _SET_DECIMALS , 16 ) - aber ob das was an Deinem Problem ändert...?
Benutzeravatar
Jan
Marvin
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

Beitrag von Jan »

Hallo Werner,

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.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
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

Beitrag von AUGE_OHR »

Jan hat geschrieben:wo sind da drei Stellen hinter welchem Komma?
em ... äh ... Punkt aber kein Komma ...
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
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

Beitrag von AUGE_OHR »

Werner hat geschrieben:

Code: Alles auswählen

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!
nun wollte ich es wissen und habe diesen vollständigen Code

Code: Alles auswählen

PROCEDURE MAIN
LOCAL persnr1 := 2147450897+100

   @ 10,10 get persnr1 picture "##########" valid (persnr1 >= 0)
   READ
   CLEAR GETS

   ? persnr1
   WAIT
RETURN
wo wird da was "gerundete" [-X
gruss by OHR
Jimmy
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
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

Beitrag von Herbert »

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.
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
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

Beitrag von Tom »

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
Antworten