Probleme mit dem Wandeln von Variablen STRF() VALF()

Anfängerfragen zum Programmieren mit PureBasic.
raynay
Beiträge: 5
Registriert: 24.02.2005 11:39
Wohnort: Ostsee
Kontaktdaten:

Probleme mit dem Wandeln von Variablen STRF() VALF()

Beitrag von raynay »

Habe folgendes Problem :

Folgender Wert 2173422,39 aus feldinhalt$
wird in A$ geschrieben als 2173422.39 (Komma in Dezimalpunkt)

A$=ReplaceString(Right(feldinhalt$,Len(feldinhalt$)-10),",",".")
Anfangssaldo.f=ValF(A$) ; umwandeln in Flieskomma-Variable

PrintN (A$+" " + StrF(Anfangssaldo.f)

Console zeigt : 2173422,39 2173422,500000

Frage 1: Warum ist die Zahl nicht gleich ?
Frage 2: Wie kann ich die richtige Zahl anzeigen lassen?
Frage 3: Wenn ich diese Zahl mit -1 multipliziere
Anfangssaldo.f=ValF(A$) *-1
dann wird das ignoriert, weil ich den falschen Befehl
STRF(..) verwende. Gibt es einen Befehl der
negative Fließkomma-Zahlen richtig anzeigt / wandelt?
Mit Ostsee-Grüßen

René
Team100
Beiträge: 104
Registriert: 13.09.2004 22:59

Beitrag von Team100 »

Fließkommazahlen sind für kommagenaue Berechnungen nicht verwendbar. Ich nehme aufgrund des Wortes Saldo an,
daß es sich um Geldbeträge handelt. Floats sind hier grundsätzlich nicht zu verwenden.

Genaue Auskunft gibt die Hilfe
Spezielle Informationen über Fließkommazahlen (Floats)

Eine Fließkomma-Zahl (auch Gleitkomma-Zahl, englisch: Floating Point Number) wird in einer Art und Weise gespeichert, die den Binär-Punkt (trennt "Ganzzahlteil" vom "Kommateil") innerhalb der Zahl "gleiten" lässt, wodurch das Speichern sehr großer aber auch sehr kleiner Zahlen (mit vielen Nachkommastellen) möglich wird. Wie auch immer, Sie können nicht sehr große Zahlen mit gleichzeitig sehr hoher Genauigkeit (sozusagen große und kleine Zahlen zur selben Zeit) speichern. Eine weitere Einschränkung von Fließkomma-Zahlen ist, dass sie stets im Binärmodus arbeiten, weshalb sie nur die Zahlen exakt speichern können, welche mittels Multiplikation oder Division mit 2 ermittelt werden können. Dies ist insbesondere wichtig zu wissen, wenn Sie versuchen, eine Fließkommazahl in einer visuell lesbaren Form darzustellen (oder mit ihr Rechenoperationen auszuführen) - das Speichern von Zahlen wie 0.5 oder 0.125 ist einfach, da sie Divisionen von 2 sind. Das Speichern von Zahlen wie 0.1 ist schwieriger, diese wird möglicherweise als Zahl 0.9996125 gespeichert. Sie können versuchen, nur eine begrenzte Anzahl an (Nachkomma-) Stellen darzustellen, seien Sie aber nicht überrascht, wenn die Darstellung der Zahl anders aussieht, als Sie dies erwarten!
Dies gilt für alle Fließkomma-Zahlen, nicht nur die in PureBasic.
Abhilfe ist die Wandlung in Centbeträge und das Verwenden von
longs. Hier wäre die maximale Größe der longs zu beachten:
-2147483648 bis +2147483647

Können diese Grenzen überschritten werden (Centbeträge!), dann
muß für die Summen auf eine Userlib zurückgegriffen werden, z.B.
die F64Lib. http://www.purearea.net/pb/download/userlibs/F64.zip
Grundsätzlich sollte man bei Verwendung von Userlibs prüfen,
ob diese mit der neuesten Version von PB arbeitet, sonst kann man eventuell ein
Update vom Autor erbitten oder eine ältere PB-Version benutzen.

Cu von Team100
Kompliziert kann es jeder lösen, aber das wirklich Geniale ist einfach.....
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

genauer:
Team100 meint, grundsätzlich mit dem hundertfachen zu rechnen,
in ganzzahlen, und bei der ausgabe das komma einzufügen.
die obergrenze für einen betrag wäre dann +/- 21.474.836,47

zur hilfe zum umwandeln folgende Procedures:

Code: Alles auswählen

Procedure.l Str2Lng(Feld.s)
    Euro = Val(Feld)
    Cent = Val(Right(Feld,2))
    ProcedureReturn 100*Euro+Cent
EndProcedure

Procedure.s Lng2Str(Zahl.l)
    Euro.l = Zahl/100
    Cent.l = Zahl-100*Euro
    ProcedureReturn Str(Euro)+","+Str(Cent)
EndProcedure
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
raynay
Beiträge: 5
Registriert: 24.02.2005 11:39
Wohnort: Ostsee
Kontaktdaten:

Danke, Userlib F64 hat geholfen

Beitrag von raynay »

Danke für Eure Antworten.

Die Lösung von Team100 hat mit nun geholfen. Die zweite Lösung Euro und Cent zu trennen ist auch okay, aber bei Zinsberechnungen sind mehrere Nachkommastellen unabdingbar.

F64_Val(Anfangssaldo.double,"-"+A$)
PrintN (Anfangssaldo$+" " + F64_Str(Anfangssaldo.double))

Ich habe die Userlib geladen und in Purebasic eingebunden.
Die o.a. neuen Befehle arbeiten im Standard schon mit sechs Nachkommastellen (erweiterbar).

Vielen Dank für Eure Mühe und die guten Lösungsansätze.
Mit Ostsee-Grüßen

René
Antworten