![MQL5 - Sprache von Handelsstrategien, eingebaut ins Kundenterminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Das obige war eine spezifische Antwort auf Ihren spezifischen Beitrag"MathRound gibt einen Double zurück; unendliche Anzahl von Dezimalstellen."
Noch einmal, laut der Dokumentationsseite.
"Rückgabewert
Wert gerundet auf die nächste ganze Zahl."
Nun eine konkrete Antwort auf diesen Teil Ihres Beitrags.
"Was auf der Seite steht, wird auch gemacht. Sie rundet. Das hat nichts mit der Frage nach mehreren Dezimalstellen zu tun."
Lesen Sie noch einmal das Zitat, dort steht: "Wert gerundet auf die nächste ganze Zahl". Eine ganze Zahl ist per Definition eine ganze Zahl ohne Nachkommastellen. Und noch einmal, wenn das nicht das ist, was sie tatsächlich tut, dann ist der Code oder die Beschreibung fehlerhaft, und das eine oder das andere oder beides muss von MQ korrigiert werden, oder es muss ein Warnhinweis erscheinen, der besagt, dass diese Funktionen nicht wie angekündigt funktionieren.
Wenn die Funktion tatsächlich den angegebenen Typ zurückgibt, aber das mathematische Äquivalent zum nächstgelegenen Integer-Wert (z. B. 1,00000 aus 1,23456, und 1 == 1,00000), aber keinen tatsächlichen Integer-Typ zurückgibt, dann muss auf der Referenzseite etwas wie "ändert den zugrunde liegenden Datentyp nicht" oder etwas anderes angegeben werden, das eindeutig ist. Ich denke, dies war eine flache Übersetzung von der russischen Originalseite und ist daher im Englischen nicht so klar, wie es sein sollte.
Die Dokumentation von MetaQuotes ist bestenfalls schwach.
Wie dem auch sei, MathRound() gibt per Definition einen Double zurück:
Würde der zurückgegebene Wert lauten: "Wert geteilt durch 2", wäre es immer noch ein Double.
Genauso wie "Wert gerundet auf die nächste ganze Zahl" immer noch ein Double ist.
Ich hoffe, das hilft
Die Dokumentation von MetaQuotes ist bestenfalls schwach.
Wie dem auch sei, MathRound() gibt per Definition ein Double zurück:
Wenn der zurückgegebene Wert lauten würde: "Wert geteilt durch 2", wäre es immer noch ein Double.
Genauso wie "Wert gerundet auf die nächste ganze Zahl" immer noch ein Double ist.
Ich hoffe, das hilft
Für mich ist nicht klar, dass "Value rounded till to the nearest integer" aufgrund der Definition von integer irgendetwas anderes als eine ganze Zahl zurückgibt. Ich verstehe, dass es tatsächlich so funktioniert, aber das unterstreicht meinen Standpunkt, dass der Code und/oder der offizielle Wortlaut der Seite fehlerhaft ist und korrigiert werden muss. Entweder muss der Code so angepasst werden, dass er einen Wert vom Typ int zurückgibt, oder der Wortlaut der Seite muss geändert werden. Wir als Benutzer haben keine Möglichkeit, das zu tun.Der Wert, den Sie für die zu rundende Zahl erhalten, ändert sich nicht, es sei denn, Sie weisen ihn der Variablen zurück zu. Wenn Sie z. B. y mit einem Wert von 1,3 runden und in x platzieren, würden Sie bei der obigen Formulierung erwarten, dass y nach Abschluss der Funktion immer noch 1.3 und x 1 enthalten, nicht 1,0. Meiner Meinung nach, und so wie ich es lese, bedeutet Runden, dass man auf den nächstgelegenen Wert rundet, auf den man versucht zu runden, und nicht auf einen Wert, der diesem Wert entspricht. Vielleicht ist der Ausdruck "something is lost in translation" hier sehr passend.
Ich bin kein Fan der Dokumentation, aber ich muss sagen, dass ich denke, dass sie in dieser Hinsicht konsistent sind. In der gesamten Dokumentation wird der zurückgegebene Datentyp (int, double, bool usw.) oben auf der Seite aufgeführt, im Abschnitt über den zurückgegebenen Wert wird dieser Datentyp später nie wiederholt. Außerdem wird in diesem Fall genau derselbe Datentyp zurückgegeben, der auch eingegeben wird.
Wenn Sie die Compiler-Direktive #property strict verwenden, sollten Sie auf jeden Fall eine Warnung erhalten:
Ich bin kein Fan der Dokumentation, aber ich muss sagen, dass ich denke, dass sie in dieser Hinsicht konsistent sind. In der gesamten Dokumentation wird der zurückgegebene Datentyp (int, double, bool usw.) oben auf der Seite aufgeführt, im Abschnitt über den zurückgegebenen Wert wird dieser Datentyp später nie wiederholt. Außerdem wird in diesem Fall genau derselbe Datentyp zurückgegeben, der auch eingegeben wird.
Wenn Sie die Compilerdirektive #property strict verwenden, sollten Sie auf jeden Fall eine Warnung erhalten:
Ich habe einen Thread im MQL5.com-Forum unter https://www.mql5.com/en/forum/61394 gestartet, der hoffentlich letztendlich bei diesem Dokumentationsproblem helfen wird. Wenn wir genügend Leute für diese Idee gewinnen, lässt MQ uns vielleicht alle dabei helfen, das zu beheben, was bisher für viele Leute ein Problem war. Ich hoffe, dass MQ diese Idee aufgreift, denn wir als Benutzer können nichts ändern.
@ knave & WH - Ich stimme euren Beispielen voll und ganz zu, aber ich sehe hier immer noch ein Problem, das ich entweder nicht klar erkläre, oder ich bin einer der wenigen, die dies als Problem sehen. Für mich beweisen eure Beispiele meine Seite dieses Themas mehr als ihr denkt, dass sie eure Seite beweisen.
knave, Ihr Beispiel gibt einen Fehler zurück, weil es nicht den Datentyp zurückgibt, den es eigentlich zurückgeben sollte, nämlich einen int. Die Tatsache, dass Sie Ihre Variable als int casten, macht es nur einfacher, das Problem zu erkennen, dass die Funktion nicht richtig funktioniert.
WH, Sie verweisen auf diese Zeile (von der Dokumentseite) und sie sagt im Grunde das Gleiche wie die Zeile, die ich hervorhebe. Das Beispiel verwendet nur einen Double als Wert, der an die Funktion gesendet wird. Keiner Ihrer Beiträge zeigt, dass 100%ig klar ist, dass der von der Funktion zurückgegebene Datentyp ein Double ist, nur dass das Beispiel einen Double sendet.
Das Runden wird allgemein akzeptiert, um den Wert einer bestimmten Zahl auf eine niedrigere Genauigkeit zu ändern. Ich denke, in diesem Punkt können wir alle zustimmen.
In diesem Fall ist es nicht anders. Auf der Seite steht "gerundet auf den nächsten ganzzahligen Wert des angegebenen numerischen Wertes". Es heißt, dass auf eine geringere Genauigkeit (int) eines anderen Wertes gerundet wird. In dem verwendeten Beispiel wird ein Double gesendet. Das ist alles, was 100%ig klar ist.
Es tut mir leid, JD4, du hast mich total verwirrt...
In keinem deiner Beiträge steht 100%ig klar, dass der von der Funktion zurückgegebene Datentyp ein Double ist, sondern nur, dass das Beispiel ein Double sendet.
Das ist genau das, was ich mit einem Pfeil markiert habe. Es wird ein Double zurückgegeben (großer roter Pfeil) und der übergebene Parameter ist ebenfalls ein Double (unter meinem Pfeil). Werfen Sie einen Blick auf eine beliebige Funktion. OrderSend() gibt einen int zurück... OrderClose() gibt ein bool.... zurück und MathRound() gibt ein double zurück
knave, Ihr Beispiel gibt einen Fehler zurück, weil es nicht den Datentyp zurückgibt, den es eigentlich zurückgeben sollte, einen int. Die Tatsache, dass Sie Ihre Variable als int casten, macht es nur einfacher, das Problem mit der Funktion zu sehen, die nicht richtig funktioniert.
Die Funktion funktioniert genau so, wie sie angekündigt wurde.
Wenn Sie denken, dass es sich um einen int handelt (was falsch ist), erhalten Sie dies:
Wenn Sie es als int typisieren, stellen Sie fest, dass Sie den falschen Datentyp verwenden:
Wenn Sie ihn als double behandeln (was er auch ist), gibt es keine Warnungen:
Tut mir leid JD4, ich kann dir nicht folgen...
Das ist genau das, was ich mit einem Pfeil markiert habe. Sie gibt ein Double zurück (großer roter Pfeil) und der übergebene Parameter ist ebenfalls ein Double (unter meinem Pfeil). Werfen Sie einen Blick auf eine beliebige Funktion. OrderSend() gibt einen int zurück... OrderClose() gibt ein bool.... zurück und MathRound() gibt ein double zurück
Die Funktion funktioniert genau so, wie sie angekündigt wurde.
Wenn Sie denken, dass es ein int ist (falsch), erhalten Sie dies:
Wenn Sie es als int typisieren, stellen Sie fest, dass Sie den falschen Datentyp verwenden:
Wenn Sie es als double behandeln (was es ist), erhalten Sie keine Warnungen:
Im Beispiel wird ein Double zurückgegeben. In Ihrem Code-Beispiel für int RoundedNumber wird ein int als Rückgabetyp zurückgegeben. Dies sollte nicht notwendig sein, da laut der Seite ein int zurückgegeben werden soll. In der oberen Zeile und in der Zeile für den Rückgabewert steht, dass auf eine ganze Zahl mit dem angegebenen Wert gerundet wird.Eine ganze Zahl, egal wie oft wir es anders sagen, hat keine Dezimalstellen, Brüche oder irgendeine andere Art, Zahlen zwischen ganzen Zahlen, Null und negativen ganzen Zahlen darzustellen. Wie das Beispiel, das ich oben gepostet habe, basierend auf den gegebenen Dokumenten, sollte das Senden der MathRound-Funktion "1.3" "1" zurückgeben, nicht "1.0", da "1.0" keine ganze Zahl ist, aber "1" schon. (Anführungszeichen nur zur Verdeutlichung)
Die Typisierung als int stellt einen Fehler dar, weil die zugrundeliegende Funktion entgegen den Angaben auf der Seite arbeitet, nicht weil sie etwas anderes als einen int zurückgeben soll. Wenn man sie als double behandelt (was sie sein kann, aber nicht sein soll), dann lässt man die falsche Funktion einfach weiter entgegen ihrer dokumentierten Aufgabe arbeiten, nämlich eine ganze Zahl zurückzugeben, die aus dem an sie gesendeten Wert gerundet wurde, der ein double ist.
Das Senden eines zu rundenden Double (so wie der Code jetzt dokumentiert ist) an einen Integer und das anschließende Casting oder Speichern des zurückgegebenen Wertes in einem Double-Typ führt nicht zu Fehlern, da eigentlich ein Int zurückgegeben werden sollte, und wenn Sie einen Int in einen Double speichern, geht bei der Umwandlung keine Präzision verloren.Die Fehler sind dazu da, den Programmierer über einen möglichen Präzisionsverlust bei den Berechnungen zu informieren. Wenn Sie einen double-Wert in einen int-Wert speichern, werden Sie einen Fehler wie den von Ihnen angezeigten erwarten, da Sie den Wert in eine andere Form mit geringerer Präzision zwingen als er vorher hatte.
Wenn die MathRound-Funktion keinen Integer zurückgeben soll, dann muss die Formulierung auf der Seite geändert werden, so dass sie nicht sagt, dass sie einen Integer zurückgeben soll. Mein Problem war nie, dass die Funktion etwas anderes tut als das, was sie tut, außer dass es im Gegensatz zu dem steht, was die Seite sagt, dass sie tun soll.Sie müssen entweder den Code der Funktion so ändern, dass sie einen int zurückgibt, wie es auf der Doku-Seite steht, oder die Doku-Seite so bearbeiten, dass sie nicht unbedingt einen int zurückgibt.
Edit: Ich habe weitere Nachforschungen sowohl in C++ als auch in Java angestellt, da MQL in gewisser Weise auf C++ basiert und syntaktisch ähnlich zu Java und C++ ist. In C++ heißt es an einer Stelle des Dokuments(http://www.cplusplus.com/reference/cmath/round/)"Round to nearest Gibt den Integralwert zurück, der x am nächsten liegt, wobei die Hälfte der Fälle von Null abgerundet wird", aber weiter unten auf der Seite heißt es"Return Value Der Wert von x, gerundet auf das nächste Integral (als Fließkommawert)."Man könnte meinen, dass dies Ihre Ansicht unterstützt, was aber nicht der Fall ist, da C++ angibt, dass ein Fließkommawert zurückgegeben wird. Die Java-Dokumentation unter http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html zeigt Folgendes zu den beiden Methoden namens round. Beide (Java und C++) sind in ihren Sprachen funktional äquivalent zu den Funktionen MathRound und/oder round in MQL.
MQL MathRound gibt einen Integer-Wert in einem Float-Datentyp zurück. Sicherlich ist es irrelevant, was C++- oder Java-Rundungsfunktionen tun. Es ist trivial, eine eigene 'int round(double a)'-Funktion in MQL zu schreiben, wenn Sie eine wollen.
(32bit)Floats können (16bit)Ganzzahlen ohne Präzisionsverlust aufnehmen. Das Problem ist, dass OP den Wert auf zwei Dezimalstellen gerundet haben möchte und erwartet, dass er genau ist. Das wird es nicht sein.
MQL MathRound gibt einen Integer-Wert in einem Float-Datentyp zurück. Sicherlich ist es irrelevant, was C++- oder Java-Rundungsfunktionen tun. Es ist trivial, eine eigene 'int round(double a)'-Funktion in MQL zu schreiben, wenn Sie eine wollen.
(32bit)Floats können (16bit)Ganzzahlen ohne Präzisionsverlust aufnehmen. Das Problem ist, dass OP den Wert auf zwei Dezimalstellen gerundet haben möchte und erwartet, dass er genau ist. Das wird er nicht sein.
Ich bin vom Thema abgekommen, da sich meine Beiträge speziell auf die Funktion bezogen, die auf eine bestimmte Art und Weise arbeitet, und ich bin fertig damit, diese Diskussion außerhalb des Themas zu posten. Wenn diese Funktionsdiskussion damit endet, sich woanders hin zu bewegen, ist das für mich in Ordnung.
Edit: Ich habe einen Thread für die weitere Diskussion über diese widersprüchliche Dokumentseite auf https://www.mql5.com/en/forum/156174 eröffnet. Gum, ich habe auf Ihren Beitrag hier in diesem Thread geantwortet.JD4, du scheinst die einzige Person zu sein, die durch dieses Problem verwirrt ist.
HonestKnave hat darauf hingewiesen, dass aus der Dokumentation eindeutig hervorgeht, dass die Funktion ein Double zurückgibt. Eine ganze Zahl wird als Double dargestellt.
"abgerundet auf die nächste ganze Zahl" bedeutet nicht, dass es in eine ganze Zahl umgewandelt wird.
Wenn ich Ihnen sage, Sie sollen ein Stück Holz auf die gleiche Länge wie ein Stück Schnur schneiden. Das Holz bleibt immer noch Holz, es verwandelt sich nicht plötzlich in ein Stück Schnur.
Die Zeile oben und die Zeile im Rückgabewert besagen, dass auf eine ganze Zahl des angegebenen Wertes gerundet wird.
Sie müssen entweder den Code für die Funktion korrigieren, so dass sie einen Integer zurückgibt, wie es auf der Doku-Seite steht, oder die Doku-Seite so bearbeiten, dass sie widerspiegelt, dass sie nicht unbedingt einen Integer zurückgibt. "Abgerundet auf die nächste ganze Zahl" ist genau das, eine ganze Zahl.
Nun, ich bin mir nicht sicher, was Sie überzeugen wird JD4. In der Dokumentation steht eindeutig und zu 100 %, dass die Funktion einen Double zurückgibt. Sie lesen etwas anderes in die Beschreibung des zurückgegebenen Wertes hinein - dort steht niemals, dass eine ganze Zahl zurückgegeben wird.
Wenn Sie sich OrderSend() ansehen, steht dort "Returned value: Gibt die Nummer des Tickets zurück, das der Bestellung vom Handelsserver zugewiesen wurde, oder -1, wenn es fehlgeschlagen ist. Um zusätzliche Fehlerinformationen zu erhalten, muss man die Funktion GetLastError() aufrufen."
Was ist also mit der Nummer gemeint? Das ist etwas vage, meinen Sie nicht? Meinen sie double? float? char? short? int? long? Die Antwort steht oben auf der Seite, wie der große Pfeil, den ich vorhin gepostet habe. Das ist das Standardformat, in dem Sie den zurückgegebenen Datentyp sehen können. (Anmerkung: Ich habe nicht "zurückgegebener Datenwert" gesagt). Mir fällt wirklich kein einziges Beispiel in der Dokumentation ein, in dem im Abschnitt "Rückgabewert" der Datentyp erwähnt wird.