FLoat Zahl mit zwei Nachkommastellen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Pure_Beginner
Beiträge: 247
Registriert: 29.09.2011 21:49
Computerausstattung: i7 9XX 4000 MHZ / 12 GB RAM / Win 8.1 64Bit / Win 7 64Bit
Wohnort: Brühl

FLoat Zahl mit zwei Nachkommastellen

Beitrag 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
PureBasic 5.30 Beta 3 (X64/X86) | Win 8 (64) Pro / Win 7 (64) Pro | Es ist der Hobbyist[/col
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: FLoat Zahl mit zwei Nachkommastellen

Beitrag 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:
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: FLoat Zahl mit zwei Nachkommastellen

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Pure_Beginner
Beiträge: 247
Registriert: 29.09.2011 21:49
Computerausstattung: i7 9XX 4000 MHZ / 12 GB RAM / Win 8.1 64Bit / Win 7 64Bit
Wohnort: Brühl

Re: FLoat Zahl mit zwei Nachkommastellen

Beitrag 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 ?
PureBasic 5.30 Beta 3 (X64/X86) | Win 8 (64) Pro / Win 7 (64) Pro | Es ist der Hobbyist[/col
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: FLoat Zahl mit zwei Nachkommastellen

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Pure_Beginner
Beiträge: 247
Registriert: 29.09.2011 21:49
Computerausstattung: i7 9XX 4000 MHZ / 12 GB RAM / Win 8.1 64Bit / Win 7 64Bit
Wohnort: Brühl

Re: FLoat Zahl mit zwei Nachkommastellen

Beitrag 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
PureBasic 5.30 Beta 3 (X64/X86) | Win 8 (64) Pro / Win 7 (64) Pro | Es ist der Hobbyist[/col
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: FLoat Zahl mit zwei Nachkommastellen

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: FLoat Zahl mit zwei Nachkommastellen

Beitrag 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
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
Pure_Beginner
Beiträge: 247
Registriert: 29.09.2011 21:49
Computerausstattung: i7 9XX 4000 MHZ / 12 GB RAM / Win 8.1 64Bit / Win 7 64Bit
Wohnort: Brühl

Re: FLoat Zahl mit zwei Nachkommastellen

Beitrag von Pure_Beginner »

Danke für eure Mühe und die Beispiele.

Werde mich dran halten.

Schönes Wochenende
Christian
PureBasic 5.30 Beta 3 (X64/X86) | Win 8 (64) Pro / Win 7 (64) Pro | Es ist der Hobbyist[/col
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Re: FLoat Zahl mit zwei Nachkommastellen

Beitrag 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"
Bild
Win11 Pro 64-Bit, PB_6.11b1
Antworten