Guten Tag!
So oft ich auch in der Hilfe lese, ich kann immer noch nicht herausfinden, WOher die gebrochene 1 am Ende kommt.
Beachten Sie, dass eine normalisierte Zahl, die mit Print() an Journal ausgegeben wird, mehr Dezimalstellen enthalten kann, als Sie erwarten. Zum Beispiel,
double a=76.671;// normalisierte Zahl mit 3 Dezimalstellen
Print("Print(76.671)=",a);// ausdrucken, wie es ist
Print("DoubleToString(a,8)=",DoubleToString(a,8));// ausdrucken mit der angegebenen Genauigkeitwird im Terminal ausgegeben:
DoubleToString(a,8)=76.67100000
Print(76.671)=76.67100000000001
Der Doppeltyp hat Genauigkeitsgrenzen, aufgrund derer Fehler auftreten können.
Ich empfehle diesen Artikel: https://www.mql5.com/ru/articles/1561
- 2009.11.02
- MetaQuotes Software Corp.
- www.mql5.com
Der Doppeltyp hat Einschränkungen bei der Genauigkeit, was zu Fehlern führen kann.
Ich empfehle diesen Artikel: https://www.mql5.com/ru/articles/1561
Ich verstehe die Empfehlung, danke.
Sie können DoubleToStr bei der Ausgabe von
aber es ist nicht klar, woher dieser überhaupt kommt!
Wenn ich eine Division/Multiplikation durchführe, ist das in Ordnung, es ist ein Fehler.
Aber mit einer Konstante, die ich mir selbst verschrieben habe?
Es stellt sich heraus, dass ich die Rundung für eine Konstante verwenden muss, die ursprünglich nicht diese Genauigkeit hat
und vor allem wird das Vertrauen in das, was tatsächlich in der Doppelvariablen gespeichert ist, untergraben!
Zitat aus der Dokumentation
Необходимо помнить, что вещественные числа хранятся в памяти компьютера с некоторой ограниченной точностью в двоичной системе счисления, в то время как общепринятой в использовании является десятичная система счисления. Поэтому многие числа, которые точно записываются в десятичной системе, в двоичной системе можно записать только в виде бесконечной дроби.
So werden beispielsweise die Zahlen 0,3 und 0,7 im Computer als unendliche Brüche dargestellt, während die Zahl 0,25 genau als Zweierpotenz gespeichert wird.
Interessant...
Ich vermute bereits, dass es nicht in MQL liegt, sondern irgendwo tiefer, auf der Ebene der 80er Standards
aber trotzdem sehr seltsam...
Ich habe es in keiner anderen Anwendungssprache gesehen.
es wäre sinnvoll, einige Umgehungsmöglichkeiten auf der Ebene der MQL-Sprache selbst zu haben
und es erklärt immer noch nicht, warum der folgende Code 0000000001 Schwänze ausgibt
current=NormalizeDouble(GlobalVariableGet("Equity-"+portfolio_id),2);
text = "Positions closed at " + (string)current + " for portfolio: " + portfolio_name;
if(!automatic) MessageBox(text,""); else Print(text);
weil ich die Normalisierung vorgenommen habe
und die Zahl ist nach wie vor gering.
Interessant...
Ich vermute bereits, dass es sich nicht um MQLs handelt, sondern irgendwo tiefer auf der Ebene der 80er Standards
aber es ist trotzdem sehr seltsam...
Ich habe dies in keiner anderen Anwendungssprache gesehen.
es wäre sinnvoll, einige Umgehungsmöglichkeiten auf der Ebene von MQL zu haben
Was ist daran so schwer?
Wenn Sie eine Genauigkeit von bis zu 4 Ziffern benötigen. Multiplizieren Sie die Zahl mit 10000, verwerfen Sie den Bruchteil und teilen Sie durch 10000.
Die mathematischen Funktionen von mql können in der Dokumentation nachgelesen werden.
text = "Positionen geschlossen um " + (string)current + " für Portfolio: " + portfolio_name;
DoubleTo String für Strom und Sie werden gut sein
Ja, ich habe bereits erkannt, dass wir die Rundung erzwingen müssen.
NormalizeDouble erledigt die Aufgabe offenbar nicht
Ja, ich habe bereits erkannt, dass wir die Rundung erzwingen müssen.
NormalizeDouble scheint die Aufgabe nicht zu erfüllen
NormalizeDouble ist genau, wie es funktioniert (und hat immer so funktioniert, beginnend mit dem ersten MQL)
Eine Zahl wird mit der 10-fachen Potenz von Ziffern multipliziert, in die ganzzahlige Form umgewandelt (wobei der Bruchteil verworfen wird) und dann durch die 10-fache Potenz von Ziffern dividiert
Was ist das Problem? Das Muster durchbrechen?
NormalizeDouble funktioniert genau wie folgt (und hat seit dem ersten MQL immer so funktioniert)
Die Zahl wird mit der 10-fachen Potenz der Ziffern multipliziert, in die ganzzahlige Form umgewandelt (der Bruchteil wird verworfen) und dann durch die 10-fache Potenz der Ziffern geteilt
Was ist das Problem? Das Muster durchbrechen?
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Guten Tag!
So oft ich auch in der Hilfe lese, ich kann immer noch nicht herausfinden, WOher die gebrochene 1 am Ende kommt.