Richtig rechnen mit PB

Anfängerfragen zum Programmieren mit PureBasic.
Gamer
Beiträge: 180
Registriert: 21.03.2005 16:59

Beitrag von Gamer »

Code: Alles auswählen

betrag.f = 250.51
gesamt.f + (betrag.f+0.00005)
Debug gesamt.f
Das wäre doch ne Möglichkeit oder? Zwar nicht 100% korrekt aber immerhin...
Gamer
Beiträge: 180
Registriert: 21.03.2005 16:59

Beitrag von Gamer »

traumatic hat geschrieben:
Gamer hat geschrieben:Außerdem das hier liefert auch ein falsches Ergebnis:

Code: Alles auswählen

a.f = 35.64 
Debug StrF(a + 0.5, 2) 
Wassn daran falsch? 35.64 + 0.5 = 36.14 ! Was kommt denn bei Dir raus?
Ich will 35.64 raushaben! Und nicht 35.63999 oder 36.14 (total falsch)!
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Gamer hat geschrieben:
traumatic hat geschrieben:
Gamer hat geschrieben:Außerdem das hier liefert auch ein falsches Ergebnis:

Code: Alles auswählen

a.f = 35.64 
Debug StrF(a + 0.5, 2) 
Wassn daran falsch? 35.64 + 0.5 = 36.14 ! Was kommt denn bei Dir raus?
Ich will 35.64 raushaben! Und nicht 35.63999 oder 36.14 (total falsch)!
Er wollte doch nur zeigen wie man korrekt mit Strings rechnen kann... /:->
Dass du das nicht kappierst wundert mich jetzt ein wenig. Hier wurden einige Lösungsverfahren präsentiert und du verstehst einfach nicht, wie es gemeint ist. Ließ dir das besser alles nochmal in Ruhe durch und dann sehen wir weiter. ;)
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

Beitrag von traumatic »

Gamer hat geschrieben:
traumatic hat geschrieben:
Gamer hat geschrieben:Außerdem das hier liefert auch ein falsches Ergebnis:

Code: Alles auswählen

a.f = 35.64 
Debug StrF(a + 0.5, 2) 
Wassn daran falsch? 35.64 + 0.5 = 36.14 ! Was kommt denn bei Dir raus?
Ich will 35.64 raushaben! Und nicht 35.63999 oder 36.14 (total falsch)!
Ich verstehe Dich nicht, ist doch alles richtig!?

Code: Alles auswählen

a.f = 35.64
Debug StrF(a, 2)    ; korrekt! => 35.64
Debug StrF(a+0.5,2) ; korrekt! => 36.14
Ich glaube Dein eigentliches Problem liegt woanders:
PB Helpfile hat geschrieben: 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.
...deshalb auch die ganzen Vorschläge hier.
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

hab mich ein wenig vertan mit den Mids.
So ist es richtig:
Zur Erklärung:
FStringToLString macht aus Euronen Cents z.B. 57.68 Euro = 5768 Cents
LStringToFString macht aus den Cents wieder Euronen z.B. 5768 Cents = 57.68 Euro
So brauchst du keine Ungenauen Floats. Weil du mit Cents rechnest.

Code: Alles auswählen

Procedure.s LStringToFString(betrag$)
Protected betrag$
ProcedureReturn Mid(betrag$,0,Len(betrag$)-2)+"."+Mid(betrag$,Len(betrag$)-1,2)
EndProcedure

Procedure.s FStringToLString(betrag$)
Protected betrag$
ProcedureReturn ReplaceString(betrag$,".","")
EndProcedure


Datei.s="aus|1&1|03.01.2002|domain|35.64|16" 

Gesamt.l=Val(FStringToLString("57.68")); Rechnet die 57 Euro 68 Cents in 5768 Cents um
betrag$ = FStringToLString(StringField(Datei.s,5,"|"))
Betrag.l=Val(betrag$)
Saldo.l=Gesamt+Betrag

MessageRequester("Ihr Saldo:","Ihr Saldo:"+ LStringToFString(Str(Saldo)))
Zuletzt geändert von 125 am 05.04.2005 16:40, insgesamt 1-mal geändert.
Gamer
Beiträge: 180
Registriert: 21.03.2005 16:59

Beitrag von Gamer »

Ich brauche einfach eine normale Währung mit 2 Kommastellen ohne 20.999 irgendwas ....

20.51
39.87
13.17
------
73.55
====

Was bringt es mit wenn ich alle Floats zusammenzähle und das Ergebnis dann falsch gerundet wird? Da hilft mir die Ausgabe mit StrF ja auch nichts
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

guck dir mein beispiel ein post über deinem an :)
Gamer
Beiträge: 180
Registriert: 21.03.2005 16:59

Beitrag von Gamer »

Jetzt peil ich gar nichts mehr:

Code: Alles auswählen

For i=0 To ZeilenAnzahl.l

; hier wird ein array durchgelaufen und immer ein "betrag" ermittelt

; hier wird der betrag zu "gesamt" hinzugefügt

Next

MessageRequester("Ihr Saldo:","Ihr Saldo:"+ LStringToFString(Str(Saldo))) 
Wieso auf einmal Saldo, Betrag und Gesamt?
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

Achso zu Gesamt addiert ich dachte gesamt ist eine andere Variable wart kurz ich mach ein neues Bsp.
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

Code: Alles auswählen

Procedure.s LStringToFString(betrag$) 
Protected betrag$ 
ProcedureReturn Mid(betrag$,0,Len(betrag$)-2)+"."+Mid(betrag$,Len(betrag$)-1,2) 
EndProcedure 

Procedure.s FStringToLString(betrag$) 
Protected betrag$ 
ProcedureReturn ReplaceString(betrag$,".","") 
EndProcedure 

For i=0 To ZeilenAnzahl.l

;Datei.s=Array(i) ;Gettet die Daten aus deinem Arry (sieht bei dir wahrscheinlich anders aus...)

Betrag.l=Val(FStringToLString(StringField(Datei.s,5,"|")))  ;Aus dem String Datei.s wird nun der betrag in Cents Gepseichert. 
Gesamt+Betrag
Next

MessageRequester("Insgesamt","Insgesamt:"+ LStringToFString(Str(Gesamt)))
Hoffe das ist einigermaßen verständlich
Antworten