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

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

betrag.l = ValF(StringField(Datei.s,5,"|"))

; gesamt.l + betrag.l

MessageRequester("",StrF(betrag.l),1)
So und wieso wird nicht 35.64 Euro ausgegeben?
Benutzeravatar
Rubiko
Beiträge: 943
Registriert: 25.02.2005 19:43
Computerausstattung: Intel i7 2600k
8GB Ram
GeForce GTX 560 Ti
Wohnort: Schwabach

Beitrag von Rubiko »

weil betrag als "long" variable gespeichert ist
änder L in F(f) dann isses float und es wird
35.6399999 ausgegeben
Ich wollte die Welt verändern, doch Gott gab mir nicht den Quelltext.
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

Gamer hat geschrieben: So und wieso wird nicht 35.64 Euro ausgegeben?
Du musst weiterhin beachten, dass StrF nicht rundet sondern einfach ab der gewünschten Anzahl an Stellen abschneidet.

35.64 wird gespeichert als 35.6399999 (das ist die Ungenauigkeit dieses Standards, nicht von PB). Schneidest du nun ab der zweiten Stelle ab, erhältst du 35.63. Korrigieren lässt sich dies durch ein zusätzliches +0.5

Code: Alles auswählen

a.f = 35.64
Debug StrF(a + 0.5, 2)
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Gamer hat geschrieben:

Code: Alles auswählen

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

betrag.l = ValF(StringField(Datei.s,5,"|"))

; gesamt.l + betrag.l

MessageRequester("",StrF(betrag.l),1)
So und wieso wird nicht 35.64 Euro ausgegeben?
Weil du versuchst, eine Gleitkommazahl in eine Integer-Zahl zu pressen. Dadurch entfallen die Gleitkommazahlen. Die Variable betrag muss schon vom Typ float sein, sonst lässt er logischer Weise die Nachkommastellen wegfallen, da hilft dann auch kein StrF mehr. ;)
Gamer
Beiträge: 180
Registriert: 21.03.2005 16:59

Beitrag von Gamer »

Und warum gibt er bei 210.51 dann 210.509995 aus?
Gamer
Beiträge: 180
Registriert: 21.03.2005 16:59

Beitrag von Gamer »

freedimension hat geschrieben:
Gamer hat geschrieben: So und wieso wird nicht 35.64 Euro ausgegeben?
Du musst weiterhin beachten, dass StrF nicht rundet sondern einfach ab der gewünschten Anzahl an Stellen abschneidet.

35.64 wird gespeichert als 35.6399999 (das ist die Ungenauigkeit dieses Standards, nicht von PB). Schneidest du nun ab der zweiten Stelle ab, erhältst du 35.63. Korrigieren lässt sich dies durch ein zusätzliches +0.5

Code: Alles auswählen

a.f = 35.64
Debug StrF(a + 0.5, 2)
Okay aber soll ich das auf den Gesamtbetrag anwenden oder bei JEDEM Betrag der addiert wird?
Benutzeravatar
Rubiko
Beiträge: 943
Registriert: 25.02.2005 19:43
Computerausstattung: Intel i7 2600k
8GB Ram
GeForce GTX 560 Ti
Wohnort: Schwabach

Beitrag von Rubiko »

irgendwie erscheint mir logisch das du es bei jedem machst... da du die kommazahlen ja dann beim gesamtbetrag mit reinbekommst
Ich wollte die Welt verändern, doch Gott gab mir nicht den Quelltext.
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

machs dir einfacher und save die ganzen Zahlen als Longs und rechne mit Cents und teil sie einfach für die Auswertung durch 100(->Euros) (setz nen . vor die letzten 2 Stellen)

Hier nen bsp.

Code: Alles auswählen

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

betrag$ = ReplaceString(StringField(Datei.s,5,"|"),".","")

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

MessageRequester("",EuroLongStringToFloatString(betrag$),1)
Gamer
Beiträge: 180
Registriert: 21.03.2005 16:59

Beitrag von Gamer »

Wie aber soll ich Strings addieren??? Vergleich mal Dein Ergebnis mit dem Originalbetrag!

Außerdem das hier liefert auch ein falsches Ergebnis:

Code: Alles auswählen

a.f = 35.64 
Debug StrF(a + 0.5, 2) 
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

Beitrag von traumatic »

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?
Antworten