Rechnen ohne Float

Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Farbfinsternis

Betreff: Rechnen ohne Float

BeitragFr, Jul 22, 2011 7:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Da das casten von String nach Float zu ungenau ist und ich mit Euro-Beträgen rechnen muss, rut mir Hyde die Sache mit Cents zu berechnen und erst bei der Ausgabe das Komma einzufügen. Das klappt ja soweit auch ganz gut aber nun muss ich 6% aus der Summe berechnen und ich habe keinen Plan wie ich das ohne Floats machen soll. Geht das überhaupt und wenn ja: Wie?
BlitzMax: [AUSKLAPPEN]
Local summeCent:Int = 123
Local aufschlagProzent:Int = 6
Local brutto:Int = (summeCent / 100) * aufschlagProzent ' zu ungenau
'Local brutto:Int = (Float(summeProzent) / 100.0) * Float(aufschlagProzent) ' auch nicht korrekt


Schon mal danke für jeden Gedankenschubser!
Farbfinsternis.tv

Der Eisvogel

BeitragFr, Jul 22, 2011 8:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Dreh die Brutto Rechnung einfach um. Also mach die Zahl erst größer und dann kleiner:
BlitzMax: [AUSKLAPPEN]
Local brutto:Int = summeCent * aufschlagProzent / 100
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.
 

HavockToxx

BeitragFr, Jul 22, 2011 16:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Eisvogel hat Folgendes geschrieben:
Dreh die Brutto Rechnung einfach um. Also mach die Zahl erst größer und dann kleiner:
BlitzMax: [AUSKLAPPEN]
Local brutto:Int = summeCent * aufschlagProzent / 100


Rechnerisch spielt es keine rolle, ob er nun summeCent* aufschlagProzent/100 oder (summeCent / 100) * aufschlagProzent rechnet. In beiden Fällen kommt 7,38 raus. Von daher ist dein Vorschlag Uninteressant denke ich mir. Nur die Frage ob Float oder Int gerechnet werden sollte, sollter er sich schon stellen. Denn Int(Integer) ist Ganzzahlen. Float sind Fließkommazahlen.

MFG
Havock

Holzchopf

Meisterpacker

BeitragFr, Jul 22, 2011 16:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Also Eisvogels Vorschlag solltest du unbedingt berücksichtigen, da bei (fast) jeder (ganzzahl-)Division Genauigkeit verloren geht, wenn du danach das ungenaue Zwischenresultat wieder multiplizierst, vergrössert sich dadurch die Ungenauigkeit. Also: Zuerst multiplizieren und erst zum Schluss dividieren.

Wenn du es noch ein bisschen genauer als auf den Cent haben möchtest, könntest du das ganze System auch anstatt in Cents in Zehntels-Cents oder gar Hundertstels-Cents umsetzen.
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Xeres

Moderator

BeitragFr, Jul 22, 2011 16:39
Antworten mit Zitat
Benutzer-Profile anzeigen
In deinem auskommentiertem Code ist ein (schreib)Fehler:
Code: [AUSKLAPPEN]
Local brutto:Int = (Float(summeCent) / 100.0) * Float(aufschlagProzent)

Es reicht auch, eine Fließkommazahl in der Rechnung zu haben um damit zu rechnen:
Code: [AUSKLAPPEN]
Local brutto:Int = (summeCent / 100.0) * aufschlagProzent

Wenn das noch nicht exakt genug ist, brauchst du vielleicht eine Funktion zum kaufmännischen runden.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Macintosh

BeitragFr, Jul 22, 2011 18:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn mit Geld gerechnet werden soll dann nimmt man lieber 2 ganzzahlen.
Denn irgendwann wird das ganze immer ungenau. (wen du viel addierst, was auch immer.)
 

HavockToxx

BeitragFr, Jul 22, 2011 18:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Was ich meinte, ist folgendes.

(summeCent / 100) * aufschlagProzent
(123/100) * 6 = 7,38

summeCent* aufschlagProzent/100
123 * 6 / 100 = 7,38

und da es eine Kommazahl ist, würde ich Float bevorzugen, da Integer nur Ganze zahlen Speichern würde, sprich nur die 7

MFG
Havock

Der Eisvogel

BeitragFr, Jul 22, 2011 18:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Und genau darum geht es Wink Farbfinsternis möchte soweit ich das verstanden habe ohne Float-Rechnung auskommen.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Midimaster

BeitragFr, Jul 22, 2011 19:15
Antworten mit Zitat
Benutzer-Profile anzeigen
@HavockToxx

Du schreibst hier nur die halbe Wahrheit:

BlitzBasic: [AUSKLAPPEN]
SummCent%=123
AufschlagProzent%=6
Print (summeCent / 100) * aufschlagProzent


Da kommt jetzt 6 raus und das ist falsch.

In der Finanzmathematik musst Du wegen möglicher Rundungsfehler (an anderen Stellen) immer mit INTEGER arbeiten. Sonst fehlt einem manchmal "ein Pfennig".

Unter dieser Voraussetzung ist es wichtig, ob man zuerst teilt oder multipliziert!
 

HavockToxx

BeitragFr, Jul 22, 2011 20:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Midimaster hat Folgendes geschrieben:
@HavockToxx

Du schreibst hier nur die halbe Wahrheit:

BlitzBasic: [AUSKLAPPEN]
SummCent%=123
AufschlagProzent%=6
Print (summeCent / 100) * aufschlagProzent


Da kommt jetzt 6 raus und das ist falsch.

In der Finanzmathematik musst Du wegen möglicher Rundungsfehler (an anderen Stellen) immer mit INTEGER arbeiten. Sonst fehlt einem manchmal "ein Pfennig".

Unter dieser Voraussetzung ist es wichtig, ob man zuerst teilt oder multipliziert!


Nein ich hab es richtig gerechnet den () wird zuerst gerechnet und das ergebnis mal den aufschlagprozent ist 7,38

Xeres

Moderator

BeitragFr, Jul 22, 2011 20:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, ohne Fließkommazahl wird nur in Integer gerechnet und das kann kein Ergebnis mit Kommastellen geben...
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

HavockToxx

BeitragFr, Jul 22, 2011 20:41
Antworten mit Zitat
Benutzer-Profile anzeigen
HavockToxx hat Folgendes geschrieben:
Der Eisvogel hat Folgendes geschrieben:
Dreh die Brutto Rechnung einfach um. Also mach die Zahl erst größer und dann kleiner:
BlitzMax: [AUSKLAPPEN]
Local brutto:Int = summeCent * aufschlagProzent / 100


Rechnerisch spielt es keine rolle, ob er nun summeCent* aufschlagProzent/100 oder (summeCent / 100) * aufschlagProzent rechnet. In beiden Fällen kommt 7,38 raus. Von daher ist dein Vorschlag Uninteressant denke ich mir. Nur die Frage ob Float oder Int gerechnet werden sollte, sollter er sich schon stellen. Denn Int(Integer) ist Ganzzahlen. Float sind Fließkommazahlen.

MFG
Havock


Das ist ja auch das was ich hier mich Gefragt hatte. Denn Prozentrechnung mit integer wird immer ungenau sein. Er müsste das ergebnis einer Ganzzahl zuordnen als alles was nach der Kommerstelle ist, auf oder abrunden und dann prüfen. Alles was über 0.5 ist heist Zahl + 1 alles was drunter ist bleibt Zahl.

Farbfinsternis

BeitragFr, Jul 22, 2011 20:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe es so gelöst:
BlitzMax: [AUSKLAPPEN]
netto * (Double(aufschlag) / 100.0)

Das Ganze geht in ein Integer zurück und wird dann wieder (auf String gecasted) ins Euro-Format gebracht. Die bisherigen Tests verlaufen zufriedenstellend.

Aber vielen Dank für Eure Anteilnahme Wink
Farbfinsternis.tv

BtbN

BeitragFr, Jul 22, 2011 20:51
Antworten mit Zitat
Benutzer-Profile anzeigen
brutto = summeCent * (aufschlag + 100) / 100

mpmxyz

BeitragFr, Jul 22, 2011 20:59
Antworten mit Zitat
Benutzer-Profile anzeigen
@HavockToxx
Prozentrechnung ist auch mit Floats ungenau. Wink
Dort verschiebt sich das Problem nur ein paar Stellen hinter das Komma.
Das Problem mit Floats und Finanzmathematik ist die Tatsache, dass selbst Addition, Subtraktion und Multiplikation mit Fehlern verbunden sein können. (Mit der vorgeschlagenen Umwandlung in Ganzzahlen lässt sich das umgehen.)
Sehe dir dieses Beispiel an:
BlitzBasic: [AUSKLAPPEN]
Local numberF#,numberI%,i%
For i=0 To 9999
numberF=numberF+i
numberI=numberI+i
Next
Print numberF+","+numberI
For i=0 To 9999
numberF=numberF-i
numberI=numberI-i
Next
Print numberF+","+numberI

(Ich habe es BB-kompatibel geschrieben.)
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Farbfinsternis

BeitragFr, Jul 22, 2011 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
...ich muss glücklicherweise nur eine handvoll Werte addieren und einen wählbaren Prozentsatz drauf schlagen. Da genügen 2 Stellen nach dem Komma als Genauigkeit. Aber ich bin glücklich zu sehen dass ich nicht wirklich bekloppt bin, sondern dass dies wirklich ein Problem der Informatik ist.
Wer es nützlich findet kann hier noch die Funktion haben mit der aus einem Cent-Betrag ein Euro-String geschraubt wird:
BlitzMax: [AUSKLAPPEN]
Function cent2Euro:String(cents:Int)
Local result:String = String(cents)[..String(cents).length - 2] + "," + String(cents)[String(cents).length - 2..]
If result.length <= 3 Then result = "0" + result

Return result
End Function
Farbfinsternis.tv

Midimaster

BeitragFr, Jul 22, 2011 23:36
Antworten mit Zitat
Benutzer-Profile anzeigen
wieviele Zahlen sind es denn? Ich hätte hier ein "nettes" Beispiel mit nur 5 Additionen und schon ein Fehler:

BlitzBasic: [AUSKLAPPEN]
a#=2000.09
For i= 1 To 5
sum# =sum# + a#
Next
Print sum#

b%=200009
For i= 1 To 5
sumb% =sumb% + b%
Next
Print sumb


Und schon fehlen 5 cents...

BtbN

BeitragSa, Jul 23, 2011 10:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem mit floats ist halt, dass sie mit x*2^n ausgerechnet werden. Und in diesem system ist es nicht möglich, sämtliche zahlen des 10er Systems darzustellen. Es kommt also recht häufig zu kleinen fehlern.
Mit ints rechnen klappt übrigens ohne probleme und fehler, wenn man es richtig rum macht.
 

HavockToxx

BeitragSa, Jul 23, 2011 10:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Midimaster hat Folgendes geschrieben:
wieviele Zahlen sind es denn? Ich hätte hier ein "nettes" Beispiel mit nur 5 Additionen und schon ein Fehler:

BlitzBasic: [AUSKLAPPEN]
a#=2000.09
For i= 1 To 5
sum# =sum# + a#
Next
Print sum#

b%=200009
For i= 1 To 5
sumb% =sumb% + b%
Next
Print sumb


Und schon fehlen 5 cents...


Sondern das Ergebnis für a ist 10000.5 und für b 100045. Und im Bezug von der ersten Rechnung wurde sogar automatisch Aufgerundet. Denn 5 * 2000.09 sind 10000.45. Float muss eben aufrunden um damit überhaupt Arbeiten zu können. Floatzahlen werden in der 3D Berechnungen eingesätzt und die GPU würde sich Tot rechnen, wenn wir ihn bei 10000 Objekte mit je X Y und z Werten mit sagen wir 4 stellen hintern Komma(.) zu einer Viewmatrix berechnen sollte. Das schafft keine GPU der welt. Nein die gehen hin und sagen ab der 1 Kommastelle alles danach ignoriren.

MFG Havock

BtbN

BeitragSa, Jul 23, 2011 11:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Das sagt float nicht. Du solltest dich erstmal informieren, wie float/double funktioniert, bevor du hier weiter Unwahrheiten verbreitest.
Einem 32bit float stehen 23bit für den zahlen wert zur Verfügung, und 8 bit für den Exponenten. Der Exponent ist zur Basis zwei, weshalb einige zahlen, die im genauigkeits-bereich von 23 bit liegen, trotzdem nicht korrekt dargestellt werden können.
Die zahl der möglichen "genau" berechneten stellen wird durch die 23bit vorgegeben. Wo in der zahl diese 23bit liegen, ist dabei egal. Also, ob 20 stellen vor oder hinter dem Komma.

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group