Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   kaufmännisch runden (https://www.delphipraxis.net/177772-kaufmaennisch-runden.html)

arnof 27. Nov 2013 14:47

AW: kaufmännisch runden
 
@JasonDX: hat Du hier die Frage gestellt ?

Wenn Du einen Sinnvollen Beitrag hast, dann schreibe Ihn. Wenn Du meinst, das mein Beitrag falsch ist, dann hoffe ich für deine Kunden, das Du nichts mit WAWIS/ERP-System usw in der Entwicklung zu tun hast!

JasonDX 27. Nov 2013 15:03

AW: kaufmännisch runden
 
Zitat:

Zitat von arnof (Beitrag 1237650)
@JasonDX: hat Du hier die Frage gestellt ?

Wenn Du einen Sinnvollen Beitrag hast, dann schreibe Ihn.

Ich habe den Thread nicht begonnen, aber es haben sich im Verlauf Fragen für mich aufgetan, die die von dir vorgeschlagene Lösung betreffen. Die erste Frage war die: Was passiert, wenn einer der nicht vorgesehenen edge-cases auftritt? Die Frage baut auf der Beobachtung auf, dass der Lösungsvorschlag nicht alle Fälle korrekt behandelt.
Die zweite Frage im Beitrag war die was passiert, wenn eine Lösung verwendet wird, welche alle Fälle korrekt abdeckt. Ich bin noch keine 25 Jahre dabei, insofern ist es durchaus interessant zu wissen, wieso eine Lösung der anderen vorgezogen wird.

arnof 27. Nov 2013 15:33

AW: kaufmännisch runden
 
Jeder muss wissen wie er es löst, den Gedanken was dazuzurechnen ist erstmal ungewöhnlich und macht sicher auf den ersten Blick komisch und mag falsch erscheinen. Andere Datentypen zu nehmen ist sicher auch eine Lösung, ich möchte mich aber nicht nur auf EMBA verlassen, manchmal ist man da halt auch verlassen 8-)

Ich kann nur aus meiner Erfahrung sagen, da ich mich in meinen Programmiererleben sicher viele Monate damit beschäftigt habe.

Vor dem runden einfach 0.000000000001 oder sowas in der Art addieren, dann klapp es auch mit dem Runden auf 2 Stellen :thumb:

Billa 27. Nov 2013 16:05

AW: kaufmännisch runden
 
Hallo,

habe normalerweise nicht viel mit Fließkommaoperationen zu tun, aber vor Jahren einen Code aus der Computersteinzeit (COBOL) gesehen. Dort wurden für Beträge erstmal grundsätzlich nur ganze Zahlen gespeichert, also z.B. Beträge in Cent. Bei jeglicher Prozentrechnung oder Division wurde dem Ergebnis 0.5 hinzuaddiert und dann der Nachkommaanteil einfach abgeschnitten. Hat wohl zufriedenstellend funktioniert (stammte angeblich aus der Versicherungsbranche). Den Code habe ich leider nicht mehr, erinnere mich aber noch gut an diese seltsame Methode ... hth

Morphie 27. Nov 2013 18:49

AW: kaufmännisch runden
 
Weil es im weitesten Sinne zum Thema passt: http://javathreads.de/2009/03/niemal...ege-berechnen/

Mikkey 27. Nov 2013 18:52

AW: kaufmännisch runden
 
@billa:
Das von Dir beschriebene Verfahren ist nicht ungewöhnlich, in COBOL gibt es aber die Ergänzung "ROUNDED" für Multiplikationen, Divisionen und "Computations", die so etwas automatisch erledigen. Die Rundung nach ähnlicher Methode habe ich selbst in kaufmännischen Anwendungen selbst schon in C++ und in Assembler benutzt.

@arnof, JasonDX:
Rechnungen mit Fließkommazahlen sind nunmal ungenau und deshalb generell nicht für kaufmännische Zwecke geeignet. Das Addieren von einem noch so kleinen "epsilon" ist und bleibt ein Hack. Wenn einem kein "Dezimal"-Datentyp zur Verfügung steht, ist es besser, bei COBOL abzugucken und alle Rechnungen mit Ganzzahlarithmetik durchzuführen - die ist nämlich genau und man hat Rundungsvorgänge selbst in der Hand.

BUG 27. Nov 2013 19:47

AW: kaufmännisch runden
 
Wie man wo rundet, ist vermutlich auch anwendungsspezifisch.
Bei durch Menschen nachvollziehenden Rechnungen, kann ich mir gut vorstellen, dass das Runden nach jeder Operation (Zinsen berechnen) passiert und das Auf-/Abrunden durch Verträge geregelt ist.
Wenn ein komplexes Modell eine bestimmten Erwartungswert für die interne Verwendung ausspucken soll, wird vielleicht nur am Ende gerundet.

Das Runden durch Addieren von 5 auf der ersten nicht-signifikanten Stelle finde ich nicht so ungewöhnlich. Im Grunde realisiert man damit das normale Runden auf eine bestimmte Stelle ohne irgendwelche Sprünge.

arnof 27. Nov 2013 20:52

AW: kaufmännisch runden
 
Zitat:

Zitat von BUG (Beitrag 1237686)
Wie man wo rundet, ist vermutlich auch anwendungsspezifisch.
Bei durch Menschen nachvollziehenden Rechnungen, kann ich mir gut vorstellen, dass das Runden nach jeder Operation (Zinsen berechnen) passiert und das Auf-/Abrunden durch Verträge geregelt ist.
Wenn ein komplexes Modell eine bestimmten Erwartungswert für die interne Verwendung ausspucken soll, wird vielleicht nur am Ende gerundet.

Das Runden durch Addieren von 5 auf der ersten nicht-signifikanten Stelle finde ich nicht so ungewöhnlich. Im Grunde realisiert man damit das normale Runden auf eine bestimmte Stelle ohne irgendwelche Sprünge.

COBOL nein danke, gibt es das überhaupt noch in der normalen Welt?

Das Runden hat man selbst im griff, wenn man eine eigene Rundungfunktion generell benutzt, was ich immer mache.

Es gibt ja auch andere Länder in denen komplett anders zu Runden ist:Beispiel Schweiz, da ist die kleinste Einheit 5 Rappen :wink:

Uwe Raabe 27. Nov 2013 21:42

AW: kaufmännisch runden
 
Zitat:

Zitat von arnof (Beitrag 1237700)
COBOL nein danke, gibt es das überhaupt noch in der normalen Welt?

Bah! Da kann ich noch einen drauf geben. Aus dem IBM RPG II Reference Manual für System/36:

Zitat:

Half-adjusting is when the single digit to the right of the last decimal
position specified is added to the same position in the result field. All decimal positions
to the right of the position specified for that field are then dropped

laboca 30. Nov 2013 00:23

AW: kaufmännisch runden
 
Hallo,

irgendwie kehrt die Diskussion über Rundung immer wieder auf.
Hier muss man wohl unterscheiden was gerundet werden soll und nach welcher Regel.
Mathematisch, Kaufmännisch oder Banker's Rounding.
Und ob es ein positiver oder negativer Betrag ist.

Auch in der kaufmännischen Rundung spielt die 4 oder 5 Stelle nach dem Komma durchaus eine Rolle, wenn man mal Zinsdifferenzgeschäfte bei einer Bank betrachten würde. Im "Tante Emma" Laden eher weniger wenn's um "drei fünfundneunzig" geht...

Ganz gut im kaufmännischen Bereich bin ich mit folgender Funktion gefahren (hab ich mal aufgeschnappt oder zusammengestrickt oder wie auch immer.. ist lange her, daher kenne ich auch den Urheber nicht mehr der den Ansatz/Lösung gebaut hat, also nicht meine Federn...)

Code:
function RoundX( value: extended; const n: integer): extended;
var
  exp: extended;
  mode: TFPURoundingMode;
begin
  value := StrToFloat(FloatToStr(value));

  mode := GetRoundMode;
  exp := IntPower(10, n);
  if value > 0 then
  begin
    SetRoundMode(rmUp);
    result := trunc(value * exp + 0.5) / exp;
  end
  else
  begin
    SetRoundMode(rmDown);
    result := trunc(value * exp - 0.5) / exp;
  end;
  SetRoundMode(mode);
end;
HIH


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:49 Uhr.
Seite 3 von 4     123 4      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz