Seite 3 von 4

Verfasst: 05.04.2005 16:28
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...

Verfasst: 05.04.2005 16:29
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)!

Verfasst: 05.04.2005 16:32
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. ;)

Verfasst: 05.04.2005 16:36
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.

Verfasst: 05.04.2005 16:38
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)))

Verfasst: 05.04.2005 16:39
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

Verfasst: 05.04.2005 16:40
von 125
guck dir mein beispiel ein post über deinem an :)

Verfasst: 05.04.2005 16:49
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?

Verfasst: 05.04.2005 16:50
von 125
Achso zu Gesamt addiert ich dachte gesamt ist eine andere Variable wart kurz ich mach ein neues Bsp.

Verfasst: 05.04.2005 16:56
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