Rundung von Zahlen in MT4 über NormalizeDouble - Seite 14

 

Es gab einmal Funktionen zum Abrunden von unten und oben

Könnte jemandem helfen

//+------------------------------------------------------------------+
double RoundMax(double price,double symbol_point,int symbol_digits)
  {
   return(NormalizeDouble(price+MyK(price,symbol_point,symbol_digits)*symbol_point, symbol_digits-1));
  }
//+------------------------------------------------------------------+
double RoundMin(double price,double symbol_point,int symbol_digits)
  {
   return(NormalizeDouble(price-MyK(price,symbol_point,symbol_digits)*symbol_point, symbol_digits-1));
  }
//+------------------------------------------------------------------+
int MyK(double price,double symbol_point,int symbol_digits)
  {
   double tmp1=NormalizeDouble(price, symbol_digits);
   double tmp2=NormalizeDouble(price, symbol_digits-1);
   return((MathAbs(tmp1-tmp2)<symbol_point)?10:5);
  }
//+------------------------------------------------------------------+
 
Victor Nikolaev:

Es gab einmal Funktionen zum Abrunden von unten und oben

Könnte jemandem helfen

Danke, ich werde sie mir für meine Sammlung besorgen.
 
lilita bogachkova:

versuchen, ein Ergebnis von0,99999999999999999 zu erhalten

X = 0.99999999999999999

10*X = 10*0.99999999999999999

10*X-X = 10*0,9999999999999-0,99999999999

9*X = 9*0.99999999999999999

erhalten wir 9*X = 9 oder X ist gleich 1 (eins)

v1 = (1/3) = 0,33333333 | v2 = 3*(1/3) = 1,00000000

oder 0,9999999999999 = 1,0

v1 (1.00000000) >= 1.0

In diesem Fall steht 0,9999999999999999999999 für 1,0. Aber die Aufgabe lautet "wegwerfen", also muss das Ergebnis Neunen enthalten.
 

Danke an alle für den hilfreichen Thread!

Ich habe mich für die Lösung entschieden, 1 Stelle mehr überNormalizeDouble zu runden und dann die letzte Stelle abzuschneiden. Bis jetzt ist das völlig in Ordnung.

 

Nochmals zur Rundung......

Bitte informieren Sie mich über die Situation (werfen Sie nicht mit Tomaten, ich bin ein Menschenfreund),

es eine solche Variable gibt:

      double delta=NormalizeDouble(new_lot-sum_lots,Lots_Digits);

      if(delta>0) delta-=OrderLots();

      if(delta<0) delta+=OrderLots();

Das Delta ist ursprünglich normalisiert,

OrderLots sollte wahrscheinlich normalisierte Dubs zurückgeben,

aber manchmal, bei seltenen Gelegenheiten, erhalte ich Zahlen wie 2.775557561562891e-17

Es ist also fast Null, aber nicht Null.......

Erste Frage: Ist das normal?

zweite Frage - wie ich es verstehe, wird es genug für mich zu tun, die zweite Normalisierung, um Schwänze zu vermeiden?

Dritte Frage (ich habe das Gefühl, dass ich sie sowieso nicht verstehen werde, aber ich stelle sie trotzdem):

Kann die Addition von zwei normierten Zahlen nicht-normierte Zahlen ergeben?

P.S. Ich entschuldige mich dafür, dass ich das Thema noch einmal aufgreife, aber ich habe einfach nicht die Kraft, alles noch einmal zu lesen.


 
transcendreamer:

Nochmals zur Rundung......

Bitte informieren Sie mich über die Situation (werfen Sie nicht mit Tomaten, ich bin ein Menschenfreund),

es eine solche Variable gibt:

      double delta=NormalizeDouble(new_lot-sum_lots,Lots_Digits);

      if(delta>0) delta-=OrderLots();

      if(delta<0) delta+=OrderLots();

Das Delta ist ursprünglich normalisiert,

OrderLots sollte wahrscheinlich normalisierte Dubs zurückgeben,

aber manchmal, bei seltenen Gelegenheiten, erhalte ich Zahlen wie 2.775557561562891e-17

Es ist also fast Null, aber nicht Null.......

Erste Frage: Ist das normal?

zweite Frage - wie ich es verstehe, wird es genug für mich zu tun, die zweite Normalisierung, um Schwänze zu vermeiden?

Dritte Frage (ich habe das Gefühl, dass ich sie sowieso nicht verstehen werde, aber ich stelle sie trotzdem):

Kann die Addition von zwei normierten Zahlen nicht-normierte Zahlen ergeben?

P.S. Verzeihen Sie mir, dass ich das Thema noch einmal aufgreife, aber ich habe einfach nicht die Energie, alles noch einmal zu lesen.

  1. Ja.
  2. Ja.
  3. Ja.
 
fxsaber:
  1. Ja.
  2. Ja.
  3. Ja.
Dankeschön
 
transcendreamer:

P.S. Ich entschuldige mich dafür, dass ich das Thema noch einmal aufgreife, aber ich habe einfach nicht die Energie, das alles noch einmal durchzugehen.

Es ist besser, es selbst mit verschiedenen Beispielen zu überprüfen, damit Sie es besser verstehen.

Das Problem ist nur, dass ich es falsch mache:

if(delta>0)

sondern so.

if(delta>0.0)

Für doppelte Zahlen. Ich weiß nicht, ob es wirklich wichtig ist, aber mit meiner Variante bin ich nie auf einen Fehler gestoßen (ich versuche, nur die gleichen Arten von Variablen zu vergleichen).

 
Andrey Dik:

Ich weiß nicht, ob es wirklich eine Rolle spielt, aber ich bin mit meiner Version noch nie auf einen Fehler gestoßen (ich versuche nur, dieselben Arten von Variablen zu vergleichen).

Das ist nicht der Fall.
 
Manche Zahlen können nur als unendlicher Bruch dargestellt werden, z. B. 1/3 im Dezimalsystem. Aber 1/3 ist kein unendlicher Bruch im tertiären System, dort ist es == 0,1. Das heißt, verschiedene Zahlensysteme haben ihre eigenen unendlichen Brüche. Folglich kann ein nicht-unendlicher Bruch im Dezimalsystem eine Eins im Binärsystem sein. Zum Beispiel: 0,1, 0,2, 0,3, 0,4, ... haben keine exakte binäre Darstellung. Wenn man NormalizeDouble zehnmal aufruft, ist es entweder 0.19999999999...1 oder 0.200000...1. Ich weiß es nicht, vielleicht ist das neu.