Ermitteln der Anzahl der Dezimalstellen beliebiger Zahlen (nicht nur Anführungszeichen) unter Umgehung von Digits() in MQL4 und MQL5

 

Ich denke, ich bin nicht der einzige, der eine seltene Situation, wo ich brauchte, um die Anzahl der Dezimalstellen zu erhalten, und Digits() Funktion funktioniert nur mit Anführungszeichen, und außerdem gibt es keine Informationen über sie irgendwo (zumindest zum Zeitpunkt des Schreibens dieses Beitrags habe ich nicht gefunden, bevor, so möchte ich zeigen, welche Lösung ich gefunden habe).


Wie sich herausstellte, das Wesen der banalen einfach, aber immer noch einen Nachteil hat - diese Funktion nicht erkennen Nullen, wenn nach ihnen gibt es keine anderen Ziffern. Zum Beispiel gibt die Funktion 2 zurück, wenn sie von 0,01 gefolgt wird, aber wenn sie von 0,0000 gefolgt wird, gibt sie 0 zurück (d.h. sie kann keine vier Nullen sehen). Berücksichtigen Sie also dieses Manko bei Ihren Entwicklungen.


Code in MQL4

int Digits_values(double value)
  {
   int digits = 0;
   string string_value = (string)value;
   int limit = StringLen(string_value);
   for(int i = 1; i < limit; i++)
     {
      if(StringSubstr(string_value,i,1) == ".")
        {
         digits = limit - (i + 1); break;
        };
     };
  //-----------------------------------------------------------------
   return(digits);
  }


Der Code bei MQL5

int Digits_values(double value)
  {
   int digits = 0;
   string string_value = (string)value;
   int limit = StringLen(string_value);
   for(int i = 1; i < limit; i++)
     {
      if(StringSubstr(string_value,i,1) == ".")
        {
         if(i == limit - 2)
           {
            if(StringSubstr(string_value,limit-2,1) == "." && StringSubstr(string_value,limit-1,1) == "0")
              {
               break;
              }
            else
              {
               digits = 1; break;
              };
           }
         else
           {
            digits = limit - (i + 1); break;
           };
        };
     };
  //-----------------------------------------------------------------
   return(digits);
  }

Der MQL5-Code musste geringfügig verbessert werden, da offenbar in MQL5 Variablen vom Typ double am Ende automatisch 0 zugewiesen wird, unabhängig davon, ob die Variable eine ganze Zahl ist oder nicht. Aus diesem Grund hat die Funktion nie 0 zurückgegeben.

 
Alexandr Sokolov:

Ich denke, ich bin nicht der einzige, der eine seltene Situation, wo ich brauchte, um die Anzahl der Dezimalstellen zu erhalten, und Digits() Funktion funktioniert nur mit Anführungszeichen, und außerdem gibt es keine Informationen über sie irgendwo (zumindest zum Zeitpunkt des Schreibens dieses Beitrags fand ich es vor, so möchte ich zeigen, welche Lösung ich gefunden).

Wie sich herausstellte, ist die Essenz banal einfach, hat aber dennoch einen Nachteil - diese Funktion erkennt keine Nullen, wenn nach ihnen keine weiteren Ziffern stehen. Zum Beispiel gibt die Funktion 2 zurück, wenn sie von 0,01 gefolgt wird, aber wenn sie von 0,0000 gefolgt wird, gibt sie 0 zurück (was bedeutet, dass sie keine vier Nullen sehen kann). Daher sollten Sie dieses Manko bei Ihren Entwicklungen berücksichtigen.

Der Code in MQL5 musste leicht verbessert werden, da in MQL5 Variablen vom Typ double am Ende automatisch 0 zugewiesen werden, egal ob die Variable einer ganzen Zahl zugewiesen ist oder nicht. Aus diesem Grund hat die Funktion noch nie 0 zurückgegeben.

Angenommen, wir geben die Zahl 2,4875 ein und die Funktion liefert 4.

Was sollen wir damit tun? Etwas, das ich nicht verstehe(

 
Alexandr Sokolov:

Ich denke, ich bin nicht der einzige, der eine seltene Situation, wo ich brauchte, um die Anzahl der Dezimalstellen zu erhalten, und Digits() Funktion funktioniert nur mit Anführungszeichen, und außerdem gibt es keine Informationen über sie irgendwo (zumindest zum Zeitpunkt des Schreibens dieses Beitrags fand ich es vor, so möchte ich zeigen, welche Lösung ich gefunden).


Wie sich herausstellte, ist die Essenz banal einfach, hat aber dennoch einen Nachteil - diese Funktion erkennt keine Nullen, wenn nach ihnen keine weiteren Ziffern stehen. Zum Beispiel gibt diese Funktion 2 zurück, wenn sie von 0,01 gefolgt wird, aber wenn sie von 0,0000 gefolgt wird, gibt sie 0 zurück (was bedeutet, dass sie keine vier Nullen sehen kann). Berücksichtigen Sie also dieses Manko bei Ihren Entwicklungen.


Code in MQL4


Der Code bei MQL5

Der MQL5-Code musste geringfügig verbessert werden, da offenbar in MQL5 Variablen vom Typ double am Ende automatisch 0 zugewiesen wird, unabhängig davon, ob die Variable eine ganze Zahl ist oder nicht. Aus diesem Grund hat die Funktion noch nie 0 zurückgegeben.

nach
string string_value = (string)value;

lesen Sie nicht weiter :-)

 
Vitaly Muzichenko:

Angenommen, wir geben die Zahl 2,4875 ein, dann gibt die Funktion 4 zurück.

Was sollen wir damit tun? Ich scheine den Sinn nicht zu verstehen(

Je nachdem, wer was braucht. Ich brauchte zum Beispiel ganze Zahlen, um den Korrelationsindex leichter berechnen zu können

 
Maxim Kuznetsov:

Sie brauchen nicht weiter zu lesen :-)

Was ist hier für einen Programmierer nicht klar?)

 
Wenn überhaupt, gibt es eine StringFind()-Funktion, so dass es nicht nötig ist, eine Schleife durch die Zeichen zu ziehen, um sie zu finden.
 
Dmitry Fedoseev:
Wenn überhaupt, gibt es eine StringFind()-Funktion, so dass es nicht nötig ist, eine Schleife durch die Zeichen zu ziehen, um sie zu finden.

danke

 

Herausgezogen

int GetDigits( double Price )
{
  int Res = 0;

  while ((bool)(Price = ::NormalizeDouble(Price - (int)Price, 8)) && (Res < 8))
  {
    Price *= 10;

    Res++;
  }

  return(Res);
}
 
fxsaber:
Auszug aus

auch eine gute Lösung

 
Alexandr Sokolov:

auch eine gute Lösung

Eine gute Lösung funktioniert in der Regel richtig

void OnStart()
{
        double price = 500000000.0001;
        Print( price, ":", GetDigits( price ));
}

Ergebnis: 500000000.0001:8

Wie viele Stellen nach dem Komma? Sind es wirklich 8?

 
A100:

Eine gute Lösung funktioniert in der Regel richtig

Ergebnis: 500000000.0001:8

Wie viele Stellen nach dem Komma? Sind es wirklich acht?

Ja, acht.