Rechnen ohne Float
Übersicht

![]() |
FarbfinsternisBetreff: Rechnen ohne Float |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 Schon mal danke für jeden Gedankenschubser! |
||
Farbfinsternis.tv |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Macintosh |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Und genau darum geht es ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@HavockToxx
Du schreibst hier nur die halbe Wahrheit: BlitzBasic: [AUSKLAPPEN] SummCent%=123 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Midimaster hat Folgendes geschrieben: @HavockToxx
Du schreibst hier nur die halbe Wahrheit: BlitzBasic: [AUSKLAPPEN] SummCent%=123 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 |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
HavockToxx |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Farbfinsternis.tv |
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
brutto = summeCent * (aufschlag + 100) / 100 | ||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
@HavockToxx
Prozentrechnung ist auch mit Floats ungenau. ![]() 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% (Ich habe es BB-kompatibel geschrieben.) mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
![]() |
Farbfinsternis |
![]() Antworten mit Zitat ![]() |
---|---|---|
...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) |
||
Farbfinsternis.tv |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 Und schon fehlen 5 cents... |
||
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group