![]() |
Re: runden von 0.0099999997765
Kurze Antwort, hochgradig inkompetent:
Die >2 Nachkommastellen lasse ich von Excel *mit Excel* runden. Alles Andere führt zu Reklamationen bei den Kunden. mfg |
Re: runden von 0.0099999997765
Zitat:
Du solltest doch keine Diplomarbeit draus machen :gruebel: Was soll ich da sagen, vielen Dank !!! Aber warum soll meine Funktion nicht mit negativen Zahlen arbeiten ? hab ich was übersehen, funktioniert doch ?! Dummweise reichen meine ASM Kenntnisse nicht aus, und ich kann die Funktion nur blind übernehmen. Testen ist da so eine Sache. Vielen Dank ! |
Re: runden von 0.0099999997765
Zitat:
Das Schlimme an manchen Menschen ist, daß sie so viele Dinge wissen, die so nicht sind. Vielleicht solltest Du Dir den ganzen Thread mal richtig durchlesen. Eventuell verstehst Du dann, warum Stoxx seine Rundungsfunktion geschrieben hat - und warum ich das Ganze etwas schneller gemacht habe. Mal nebenbei : Mit welchem Zahlenformat willst Du denn eine Rundung, wie Stoxx sie benötigt, erreichen ? |
Re: runden von 0.0099999997765
Hallo allerseits,
@Amateurprofi Du zitierst stoxx mit "Um nach einem Hin und Herwandeln ..." Ich kann das nirgendwo in diesem Thread finden, wo hast Du das her ? @stoxx Frage zu Deiner Broker API: Erhältst Du zu jedem Kurswert immer auch die minimale Schrittweite oder kannst Du die sonstwie zuverlässig bestimmen bevor Du mit den Kurswerten irgendwelche Berechnungen durchführst? Sind die Anzahl der Nachkommastellen bei allen Werten unbekannt, oder nur die der minimalen Schrittweiten? |
Re: runden von 0.0099999997765
Hallo Bit4bit, das hin und herwandeln bezog sich auf diesen Thread: (sind übrigens zwei ganz verschiedenen Anwendungsfälle)
![]() Zitat:
0,4999999878 steht dann drin. Aus der größe Zahl könnte man sicherlich bestimmen, dass eine Nachkommastelle sinnvoll wäre. Ich brauche aber genau die 0,5 um zum beispiel einen Wert von 5300,398978 auf 5300,5 runden zu können. Und eben nicht auf 5300,4 (was mit dem Wissen möglich gewesen wäre, dass man auf eine Nachkommastelle runden möchte) Wenn man dann einen Trade an die Börse schickt wird die Order mit einem Preis von 5300,4 abgewiesen- kein gültiger Preis. Somit brauchte ich eine Funktion, die mir aus 0,4999987 -> 0,5 herstellt. (wenn man mit 0,49999 anfängt zu runden ergibt das ganz unschöne Zahlen ;-) falls noch weiteres Interesse an der besagten API besteht ;-) ![]() |
Re: runden von 0.0099999997765
gelöscht
|
Re: runden von 0.0099999997765
Hi stoxx , hab noch zwei Fragen:
Ist die Anzahl der Nachkommastellen für jeden Kurswert bekannt? (Ich vermute mal : Ja) Welche Werte können denn überhaupt bei den minimalen Schrittweiten vorkommen, gibt es dort vielleicht eine Bildungsregel? Welche API benutzt Du denn, hab nix für Delphi gefunden ? |
Re: runden von 0.0099999997765
Hi Bit, was hast Du denn vor, dass Du so genau fragst ?
Zitat:
Zitat:
Zitat:
Üblicherweise würde man aber die völlig gleichwertige ActiveX Schnittstelle benutzen. Hast Du schonmal mit ActiveX gearbeitet ? Die API musst Du einfach als Typbibliothek importieren und danach steht Dir die API im Objectinspektor zur Verfügung. vlg stoxx |
Re: runden von 0.0099999997765
Liste der Anhänge anzeigen (Anzahl: 1)
Hi stoxx, ich hab nix vor, finde Dein Problem aber interessant!
Wenn man im Dezimalsystem abrunden will, teilt man einfach durch die entsprechende Zehnerpotenz und entfernt alle Nachkommastellen. Wenn man aufrunden will, addiert man vorher einen Wert von 9/10 der Zehnerpotenz. Das kaufmännische Runden unterscheidet sich hier nur dadurch, dass vor der Division nicht 9/10 sondern die Hälfte der Zehnerpotenz addiert wird. Möchte man für die Rundung jetzt Schrittweiten (S) wie 0,25 oder 0,5 verwenden, so formt man die zu rundende Zahl vor der Rundung durch eine Division durch S um, so dass wieder mit Schrittweiten von 10 gearbeitet werden kann. Dann rundet man wie oben beschrieben (Aufrunden, Abrunden oder kaufmännisch runden) und macht die Umformung durch die Multiplikation mit S wieder rückgängig. Kommen Werte aus der API, so können sie mit dieser Methode erst einmal "in Form" gebracht werden. Dabei ist es natürlich notwendig, dass die minimale Schrittweite bekannt ist. Für die Übergabe an die API müssen die Werte dann eventuell wieder durch 1.000.000 geteilt werden. Jetzt endlich zu Deinem ursprünglichen Problem: Ich denke mal, dass Du als minimale Schrittweite jeweils eine Zahl übergeben bekommst, die eigentlich nicht kleiner sein kann als 0,000001 und wohl nicht mehr als 4 signifikante Ziffern enthält, oder ? Die Darstellungsgenauigkeit einer Single müsste also eigentlich vollkommen ausreichend sein um diese Zahl darstellen zu können. Wenn eine solche Zahl in ihrer dezimalen Darstellung eine Reihe von Neunen enthält heißt das, dass die interne (binäre Darstellung) knapp unterhalb des tatsächlichen (korrekten) Wertes liegt. Entscheidend für die Korrektur dieser Zahl auf einen "vernünftigen" Wert ist folgende Überlegung: Die Stellen vor dem Komma benötigen zu ihrer binären Darstellung eine bestimmte Anzahl von Bits. Zahlen zwischen 64 und 127 belegen zum Beispiel alle 7 Bits, die Zahlen zwischen 128 und 255 benötigen 8 Bits usw. Diese Bits gehen für die Darstellung des Dezimalbruches verloren. Da eine Single Floating Point Variable in Delphi für die interne Darstellung der Mantisse 23 Bit benutzt, kann man sich die Anzahl der für den Binärbruch verfügbaren Bits jeweils ausrechnen. Nur Zahlen die kleiner als 8 sind können hier noch mit 6 Nachkommastellen dargestellt werden. Für 4 Nachkommastellen muss die Zahl kleiner als 512 sein. Zahlen kleiner als 65536 erlauben noch 2 Nachkommastellen. Man kann jetzt in Abhängigkeit der Größe einer Zahl entscheiden ob auf 2, 4 oder 6 Nachkomma-stellen aufgerundet werden muss. Dafür sind nur wenige Vergleiche notwendig. Alle anderen Werte, die Du durch die API übergeben bekommst, dürften dann also Kurswerte oder so was darstellen. Hier kennst Du ja die minimale Schrittweite und kannst die Werte wie oben beschrieben anpassen. Hab das ganze mal mit einigen Beispielen versehen und noch ausführlicher beschrieben als Anhang beigefügt. |
Re: runden von 0.0099999997765
Hallo bit4bit,
ich habe Deinen Beitrag erst jetzt irgendwie gelesen, Du hast Dir viele Gedanken darum gemacht. Zitat:
Wenn Du Dir den folgenden Beitrag anschaust: ![]() die Zahlen werden in 32 Bit in "meinem" speziellen Format abgespeichert ( in einem Integer) , bieten aber dennoch mehr Anzahl signifikanter Stellen, als ein Single Wert, weil ich für die Kodierung des "Exponenten" nicht 8 Bit wie bei einem Single Wert, sondern nur 2 Bit verwende. 0XX0 0000 0000 0000 0000 0000 0000 0011 in XX ( Bit 29 und Bit 30) werden die Nachkommstellen codiert. 4 Zustände sind mit 2 Bits möglich. ich benutze entweder 2, 4 oder 6 Nachkommastellen. Eine Zahl wie 0,5 * 10^-12 abzuspeichern ist dann natürlich nicht möglich, aber eben auch nicht nötig für meine Zwecke ! Zitat:
Was natürlich richtig ist, (weiß nicht, ob Du das gemeint hast) .. man könnte die minimale Preisdifferenz, wenn man sie erhält, zum Beispiel 0,249999999 selbst versuchen erstmal auf 0,25 zu runden (Anhand der Größe an sich dieser Zahl). Um dann damit wieder den eigentlichen Preis zu runden. Für alle Fälle wo ich aber wiederum nur die Zahl an sich kenne ( nicht die 0,25 ) macht sich das Verfahren sehr gut. warum machst Du das runden so kompliziert und addierst erst noch 9/10 ? round(wert / 0.25) * 0.25 bringt die mir gewünschten Ergebnisse. Gruß stoxx |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz