Seite 1 von 2

FLoat Zahl mit zwei Nachkommastellen

Verfasst: 12.10.2012 19:00
von Pure_Beginner
Hallo zusammen,

Hätte mal eine Frage zu Fließkomma-variablen.

Ist es möglich diese auf zwei Nachkommastellen zu beschränken.

Eleganter als in meinem code ?

Code: Alles auswählen

 Ergebnis.s = StrD(Summe, 2) 
Ohne in einen String zu wandeln ?

Grüße
Christian

Re: FLoat Zahl mit zwei Nachkommastellen

Verfasst: 12.10.2012 19:22
von Josh

Code: Alles auswählen

Define Summe.f = 3.144992654
Summe = Round (Summe * 100, #PB_Round_Nearest) / 100
Debug Summe
Scheint aber hier etwas ungenau. Mit einer reinen Int Lösung wird es auch nicht besser :cry:

Re: FLoat Zahl mit zwei Nachkommastellen

Verfasst: 12.10.2012 19:30
von STARGÅTE
Pure_Beginner hat geschrieben:Ist es möglich diese auf zwei Nachkommastellen zu beschränken.
Vermutlich möchtest du mit Geld rechnen? Dann nimmt bitte lieber Integers (also Ganzzahlen) und rechne in Cent oder so.
So hast du exakte Rechungen und kannst sehr einfach die Zahl anzeigen lassen.
FLießkommazahlen haben immer die "blöde" eigenschaft, das sich größe und kleine Zalen nicht vertragen und dir bei großen Geldbeträgen die Cents einfach verloren gehen.

Re: FLoat Zahl mit zwei Nachkommastellen

Verfasst: 12.10.2012 20:06
von Pure_Beginner
Danke für eure Antworten.

@STARGÅTE
was bedeutet große und kleine Zahlen die Cents gehen verloren ?
Rechnet PB nicht richtig ?

Re: FLoat Zahl mit zwei Nachkommastellen

Verfasst: 12.10.2012 20:15
von STARGÅTE
Das liegt nicht an PB, sondern an der Natur von Fließkommazahlen:

Code: Alles auswählen

Value.f = 1.99

Debug Value

Value + 10000000

Debug Value
Natürlich kannst du auch Doubles verwenden, führ aber zum selbem Problem (nur halt später bei noch größeren Zahlen).
Aber vllt sagt du erst mal, warum du "genau" 2 Nachkommastellen brauchst.

Re: FLoat Zahl mit zwei Nachkommastellen

Verfasst: 12.10.2012 20:50
von Pure_Beginner
@STARGÅTE

hab's begriffen.

die Nachkommastelle brauche ich um mit Eurobeträgen zu rechnen und anzuzeigen.
Plötzlich finde ich das wandeln in eine Stringt überhaupt nicht mehr so schlecht. :lol:

Grüße und schönes Wochenende
Christian

Re: FLoat Zahl mit zwei Nachkommastellen

Verfasst: 12.10.2012 21:40
von STARGÅTE
Ich würde dir aber trotzdem raten mit Cents zu arbeiten.
Auch die Ausgabe ist mit einer Prozedur schnell gemacht:

Code: Alles auswählen

Procedure.s Get(Cent.q)
	ProcedureReturn InsertString(Str(Cent), ",", Len(Str(Cent))-1)+" €"
EndProcedure

Debug Get(199)
Aber es ist natürlich deine Entscheidung, ich möchte hier nur Alternativen zeigen.

Re: FLoat Zahl mit zwei Nachkommastellen

Verfasst: 12.10.2012 22:00
von NicknameFJ
STARGÅTE hat geschrieben: Aber es ist natürlich deine Entscheidung, ich möchte hier nur Alternativen zeigen.
Nicht nur Alternativen.
Auch wenn das Ergebnis nach Umwandlung in einen String richtig angezeigt wird wird intern nach wie vor mit dem falschen Ergebnis weitergerechnet.
Beim Rechnen mit Float´s können sich dadurch die entstandenen Fehler auch aufsummieren.

Daher in kaufmännischen Anwendungen immer mit Ganzzahlen in Cent rechnen. Alles andere ist - Entschuldigung - reiner Pfusch.

Grüße

NicknameFJ

Re: FLoat Zahl mit zwei Nachkommastellen

Verfasst: 12.10.2012 22:26
von Pure_Beginner
Danke für eure Mühe und die Beispiele.

Werde mich dran halten.

Schönes Wochenende
Christian

Re: FLoat Zahl mit zwei Nachkommastellen

Verfasst: 13.10.2012 23:39
von Falko
Hab auch noch ein kleines Beispiel in beiden Richtungen
(Punkt kann man in Komma abändern):

Code: Alles auswählen

Global cent.s
Global euro.s

Procedure.s Euro2Cent(euro.s)
  If FindString(euro,".")
     ProcedureReturn RemoveString(euro,".")
  Else
     ProcedureReturn Str(Val(euro)*100)
  EndIf
EndProcedure

Procedure.s Cent2Euro(cent.s)
  Euros.s=Str(Val(cent)/100)
  Euros+","+ Str(Val(cent) % 100)
  ProcedureReturn Euros.s 
EndProcedure


Debug Euro2Cent("10.12") + " Cent"
Debug Cent2Euro("19921") + " Euro"