Numerische Werte
Moderator: Moderatoren
Numerische Werte
Hallo xBase-Forum,
auf der Suche nach einem Problem mit dem ADS, ADSDBE und der Index-Erstellung ist mir folgendes aufgefallen:
In einer Datenbank (nur ein Datensatz) pflege ich einen Zähler für die fortlaufende Auftragsnummer. Dieses Datenbank-Feld ist definiert mit N 8,0.
Den Wert lese ich unspektakulär in eine Variable ein: nauftrag:=stat->statnummer
Wenn man sich nun den Wert mit entsprechender Picture-Klausel anzeigen lässt, erhält man folgendes Ergebnis:
532535,000000000100000000000000
und wenn man .0000000001 hinzuaddiert
erhält man tatsächlich folgendes Ergebnis
532535,000000000200000000000000
Wenn man den 1. Wert rundet auf "keine" Nachkommastelle, erhält man das gleiche Ergebnis (wie 1).
Mich interessiert, warum ist das so? Ich bräuchte einfach eine Ganze-Zahl.
Ich glaube, dass es deshalb beim Speichern des Datensatzes in der Auftragsdatenbank in Zusammenhang mit Multiplikationen in der Index-Definition zu Problemen mit der ADSDBE kommt.
Grüße aus Bonn
Frank
auf der Suche nach einem Problem mit dem ADS, ADSDBE und der Index-Erstellung ist mir folgendes aufgefallen:
In einer Datenbank (nur ein Datensatz) pflege ich einen Zähler für die fortlaufende Auftragsnummer. Dieses Datenbank-Feld ist definiert mit N 8,0.
Den Wert lese ich unspektakulär in eine Variable ein: nauftrag:=stat->statnummer
Wenn man sich nun den Wert mit entsprechender Picture-Klausel anzeigen lässt, erhält man folgendes Ergebnis:
532535,000000000100000000000000
und wenn man .0000000001 hinzuaddiert
erhält man tatsächlich folgendes Ergebnis
532535,000000000200000000000000
Wenn man den 1. Wert rundet auf "keine" Nachkommastelle, erhält man das gleiche Ergebnis (wie 1).
Mich interessiert, warum ist das so? Ich bräuchte einfach eine Ganze-Zahl.
Ich glaube, dass es deshalb beim Speichern des Datensatzes in der Auftragsdatenbank in Zusammenhang mit Multiplikationen in der Index-Definition zu Problemen mit der ADSDBE kommt.
Grüße aus Bonn
Frank
Hallo Frank,
hattest Du der Variable nauftrag bei der Initialisierung einen Wert zugewiesen, etwa so:
wenn nicht, einfach mal ausprobieren. Was ergibt eigentlich:
Mit freundlichen Grüßen
Joachim Krause
hattest Du der Variable nauftrag bei der Initialisierung einen Wert zugewiesen, etwa so:
Code: Alles auswählen
LOCAL nauftrag:=0
Code: Alles auswählen
nauftrag:=Int(stat->statnummer )
Joachim Krause
Hallo Joachim,
Danke für die Hinweise. Ich hatte die Variable (habe sofort schlechtes Gewissen bekommen) ausnahmsweise mal deklariert. Auf die Idee mit der INT()-Funktion wäre ich nicht gekommen.
Aber xBase zeigt sich FAST, aber nicht völlig unbeeindruckt:
kanzeige(n2auftrag,int(n2auftrag),int(n2auftrag+0.0000000001),int(n2auftrag)+0.0000000001)
Anzeige:
532541,000000000100000000000000
532541,0000000001000000000000000
532541,000000000100000000000000
532541,000000000200000000000000
Insbesondere der dritte Parameter zeigt, dass da wohl System hintersteckt. Aber welches?
Grüße
Frank
Danke für die Hinweise. Ich hatte die Variable (habe sofort schlechtes Gewissen bekommen) ausnahmsweise mal deklariert. Auf die Idee mit der INT()-Funktion wäre ich nicht gekommen.
Aber xBase zeigt sich FAST, aber nicht völlig unbeeindruckt:
kanzeige(n2auftrag,int(n2auftrag),int(n2auftrag+0.0000000001),int(n2auftrag)+0.0000000001)
Anzeige:
532541,000000000100000000000000
532541,0000000001000000000000000
532541,000000000100000000000000
532541,000000000200000000000000
Insbesondere der dritte Parameter zeigt, dass da wohl System hintersteckt. Aber welches?
Grüße
Frank
Hallo Frank,
dieses Problem hatte ich auch schon in einem anderem Zusammenhang, also ADS – unabhängig, bei der Programmierung eines Zufallsgenerator. Letztendlich habe ich mir dann meine eigene INT()-Methode geschrieben, hier liegt wohl ein Xbase Fehler vor:
seit Verwendung dieser Methode habe ich keine Probleme mehr, habe es allerdings auch nicht mehr weiter verfolgt. Einfach mal ausprobieren ...
Mit freundlichen Grüßen
Joachim Krause
dieses Problem hatte ich auch schon in einem anderem Zusammenhang, also ADS – unabhängig, bei der Programmierung eines Zufallsgenerator. Letztendlich habe ich mir dann meine eigene INT()-Methode geschrieben, hier liegt wohl ein Xbase Fehler vor:
Code: Alles auswählen
**********************************************************************
METHOD SYSC0A01:SysInt(nValue)
**********************************************************************
LOCAL cStrNumber:=Transform(nValue,""), nDmy:=0
cStrNumber:=StrTran(cStrNumber,SetLocale(NLS_STHOUSAND),"")
nDmy:=Rat(SetLocale(NLS_SDECIMAL),cStrNumber)
IF nDmy <> 0
nDmy:=Val(Left(cStrNumber,nDmy-1))
ELSE
nDmy:=Val(cStrNumber)
ENDIF
RETURN nDmy
Mit freundlichen Grüßen
Joachim Krause
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Hi,
Xbase++ kennt keine Ganzzahlen. So einfach ist das.
Bei Transform() und str() werden diese Werte passend gerundet und mit int() erzeugt man eine Fließkommazahl, die ganz dicht an einer INT ist, aber es bleibt eine Fließkommazahl.
Xbase++ kennt keine Ganzzahlen. So einfach ist das.
Bei Transform() und str() werden diese Werte passend gerundet und mit int() erzeugt man eine Fließkommazahl, die ganz dicht an einer INT ist, aber es bleibt eine Fließkommazahl.
Zuletzt geändert von brandelh am Di, 20. Feb 2007 1:36, insgesamt 1-mal geändert.
Gruß
Hubert
Hubert
Hi,
aber in meinem Beispiel war es nicht ganz einerlei. Wenn man Int(0,irgendetwas) eingibt, einen Vergleich mit 0 durchführt und dann noch höflicher weise ein FALSE zurückbekommt, dann kann ich nicht viel Freude an dem geschilderten Sachverhalt in einer DO WHILE - Schleife finden ...
Mit freundlichen Grüßen
Joachim Krause
aber in meinem Beispiel war es nicht ganz einerlei. Wenn man Int(0,irgendetwas) eingibt, einen Vergleich mit 0 durchführt und dann noch höflicher weise ein FALSE zurückbekommt, dann kann ich nicht viel Freude an dem geschilderten Sachverhalt in einer DO WHILE - Schleife finden ...
... wie man's eben nimmt!Xbase++ kennt keine Ganzzahlen. So einfach ist das.
Mit freundlichen Grüßen
Joachim Krause