Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

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)

Perlsau 4. Dez 2013 05:23

AW: kaufmännisch runden
 
Zitat:

Zitat von Smut (Beitrag 1238425)
Ganz tolles Thema, ganz tolle Beiträge, jedoch für mich als Anfänger total daneben...

Irgendwie finde ich es daneben, Antworten, die man mangels Grundkenntnissen nicht versteht, als total daneben zu bezeichnen ...

Zitat:

Zitat von Smut (Beitrag 1238425)
Frage: Was benutzt man am Besten an Formaten in der Datenbank für Preise und Mengen, um im Nachhinnein möglichst wenig Probleme zu haben?

Man verwendet für Geldbeträge gewöhnlich nicht denselben Typ wie für Mengen. Bei Geldbeträgen bietet sich der Currency-Typ (wie schon der Name nahelegt) an. Furtbichler hatte das in diesem Beitrag bereits ausführlich erläutert. Bei Mengen kommt es auf die jeweilige Einheit an: Für Stück genügt ein Integer, bei Gewichten, Längenmaßen und dergleichen nimmt man jenen Fließkomma-Typ, der die erforderliche Genauigkeit bereitstellt.

Deine Fragestellung ist mir etwas zu allgemein gehalten, denn als Anfänger mit nur lückenhaften Grundkenntnissen hat man eigentlich immer mit Problemen zu kämpfen. Da kommt man nicht drumrum, da muß man hindurch.

Zitat:

Zitat von Smut (Beitrag 1238425)
Ich habe obiges jetzt nicht so wirklich verstanden, und diese Art und Weise, dass ich irgend ein X dazuaddieren sollte, finde ich befremdlich. :oops:

Dann wäre es doch sicher nicht verkehrt, denjenigen, der dir das empfohlen hat, noch einmal um eine etwas einfacher formulierte Darstellung zu bitten. Ebenso hilfreich könnte es u.U. sein, dich selbst einmal mit den verschiedenen Float-Typen etwas ausgiebiger zu befassen.

Furtbichler 4. Dez 2013 06:59

AW: kaufmännisch runden
 
Zitat:

Zitat von Smut (Beitrag 1238425)
G...und diese Art und Weise, dass ich irgend ein X dazuaddieren sollte, finde ich befremdlich. :oops:

Vollkommen richtig. Das findet so ziemlich jeder.

Aaaber: In Delphi geht das kaum anders (bei Geld gibts -zum 1000x- den 'Currency' Datentyp, der mit einigen Datenbanken kompatibel is, sowit ich weiß)

Schau dir mal (aka bilde dich weiter ;-) ) Artikel über Floating Point, Fließkommazahlen usw. an. Das ist das gängige Format, indem Zahlen mit Dezimalanteil verarbeitet werden. Wieso gängig? Weil die Operationen darauf, also +,-,*,/, Sin etc. hochoptimiert durchgeführt werden können.

Pferdefuß: Damit können so "einfache" Zahlen wie "0,1" genaugenommen nicht dargestellt werden, dafür aber (z.B.) so wichtige Zahlen wie "0,09999999999643" und "0,100000000000367". Warum das so ist, wirst Du sehen, wenn Du die entsprechenden Artikel liest.

Beide Zahlen, also die 0,09999... und die 0,10000.. werden aber beim Debuggen in Delphi als 0,1 angezeigt (gemein, was?). Ein Vergleich mit "0,1" ergibt dann aber FALSE. Und ein Vergleich auf ">0,1" unter umständen auch. Und obwohl Delphi im Debugger die Zahl vielleicht als 0,1 anzeigt, wird sie in der Datenbank als 0,99999999999999643 abgelegt (oder eben als 0,1000000000000367).

Aber so etwas will man ja nicht unbedingt auf einer Rechnung sehen, oder als Preisschild im Supermarkt (die wären ganz schön lang, die Teile): Also muss man runden. Das muss man sowieso, wenn man prozentuale Anteile (Rabatt, VAT usw) ausrechnet. So, und beim Runden muss man dann erstens 0,005 dazuaddieren, damit man kaufmännisch rundet und dann blöderweise nochmals 0,0000000000001 um diesem Format ein Schnippchen zu schlagen.

Jeder Delphi-Programmierer geht da durch und stellt die gleichen Fragen. Und jeder gute Delphi-Programmierer weiß darauf irgendwann die Antwort. Ich gehe davon aus, das Du einer derjenigen sein wirst, die dem nächsten Rookie das ganz genau erklären kann.

Und für Leute, die erst Fahrrad fahren lernen ist es echt nervig, von den Fahrradfahrern, die an einem vorbeifahren, erklärt zu bekommen, wie leicht das doch ist.

p80286 4. Dez 2013 12:27

AW: kaufmännisch runden
 
Zitat:

Zitat von Smut (Beitrag 1238425)
Ich habe obiges jetzt nicht so wirklich verstanden, und diese Art und Weise, dass ich irgend ein X dazuaddieren sollte, finde ich befremdlich. :oops:

1,346+0,005=1,351 letzte Stelle streichen => 1,35
1,344+0,005=1,349 letzte Stelle streichen => 1,34

Was ist daran befremdlich? Du willst einen gerundeten Wert bekommen, der sieht Deinem ursprünglichen Wert nur ähnlich hat aber ansonsten garnichts mit diesem zu tun!
Das ist nur für die Darstellung.

Zitat:

Frage: Was benutzt man am Besten an Formaten in der Datenbank für Preise und Mengen, um im Nachhinnein möglichst wenig Probleme zu haben?
Das kommt darauf an! geht es um 12 Eier für dreifuffzigbenötigst du andere Typen als wenn du die Umsätze eines Großkonzerns zu verwalten hast.

Mein Tip dazu: wenn 16Bit reichen sollten, dann nimm 32Bit weil es kommt immer mehr als man glaubt.

Gruß
K-H

BUG 4. Dez 2013 15:55

AW: kaufmännisch runden
 
TheDailyWTF hat heute was zu dem Thema :mrgreen:

himitsu 4. Dez 2013 17:01

AW: kaufmännisch runden
 
Zitat:

Zitat von BUG (Beitrag 1238518)
TheDailyWTF hat heute was zu dem Thema :mrgreen:

Ist der Beitrag von einem Anti-Delphi-Jünger geschrieben wurden?

An allem ist Delphi schuld. :roll:

Man kann natürlich alles umständlich selber machen,
oder Delphi-Referenz durchsuchenSet8087CW or Delphi-Referenz durchsuchenSetRoundMode :angel:

p80286 4. Dez 2013 17:31

AW: kaufmännisch runden
 
Jetzt mal ernsthaft
gerundet werden soll auf 2 Stellen hinterm Komma, gegeben ist
0,44444444444444444444444445
was kommt raus? 0,45 oder 0,44?

Gruß
K-H

himitsu 4. Dez 2013 17:36

AW: kaufmännisch runden
 
0,44 ... egal ob mathematisch oder kaufmännisch gerundet


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 Uhr.
Seite 4 von 4   « Erste     234   

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