Obtenir le nombre de décimales de n'importe quel nombre (pas seulement les guillemets) en contournant Digits() dans MQL4 et MQL5

 

Je pense que je ne suis pas le seul à avoir eu une situation rare où j'avais besoin d'obtenir le nombre de décimales, et la fonction Digits() ne fonctionne qu'avec des guillemets, et d'ailleurs il n'y a aucune information à ce sujet nulle part (du moins au moment d'écrire ce billet, je ne l'ai pas trouvée avant, donc je veux montrer quelle solution j'ai trouvée).


Comme il s'est avéré, l'essence de la banale simple, mais a encore un inconvénient - cette fonction ne reconnaît pas les zéros, si après eux il n'y a pas d'autres chiffres. Par exemple, la fonction renvoie 2 lorsqu'elle est suivie de 0,01, mais lorsqu'elle est suivie de 0,0000, elle renvoie 0 (c'est-à-dire qu'elle ne peut pas voir quatre zéros). Tenez donc compte de cette lacune dans vos développements.


Code en 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);
  }


Le code à 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);
  }

Le code MQL5 a dû être légèrement amélioré, car apparemment dans MQL5 les variables de type double se voient automatiquement attribuer 0 à la fin, que la variable soit un entier ou non. Pour cette raison, la fonction n'a jamais retourné 0

 
Alexandr Sokolov:

Je pense que je ne suis pas le seul à avoir eu une situation rare où j'avais besoin d'obtenir le nombre de décimales, et la fonction Digits() ne fonctionne qu'avec des guillemets, et d'ailleurs il n'y a aucune information à ce sujet nulle part (du moins au moment de l'écriture de ce post je l'ai trouvé avant, donc je veux montrer quelle solution j'ai trouvée).

Il s'est avéré que l'essence est banalement simple, mais présente tout de même un inconvénient - cette fonction ne reconnaît pas les zéros, si après eux il n'y a pas d'autres chiffres. Par exemple, cette fonction renvoie 2 lorsqu'elle est suivie de 0,01, mais lorsqu'elle est suivie de 0,0000, elle renvoie 0 (ce qui signifie qu'elle ne peut pas voir quatre zéros). Vous devez donc tenir compte de cette lacune dans vos développements.

Le code dans MQL5 a dû être légèrement amélioré, car apparemment dans MQL5 les variables de type double sont automatiquement assignées , 0 à la fin, peu importe si la variable est assignée à un entier ou non. Pour cette raison, la fonction n'a jamais retourné 0.

Supposons que nous donnions le nombre 2,4875 et que la fonction renvoie 4.

Que devons-nous en faire ? Quelque chose dont je ne comprends pas l'intérêt(

 
Alexandr Sokolov:

Je pense que je ne suis pas le seul à avoir eu une situation rare où j'avais besoin d'obtenir le nombre de décimales, et la fonction Digits() ne fonctionne qu'avec des guillemets, et d'ailleurs il n'y a aucune information à ce sujet nulle part (du moins au moment de l'écriture de ce post je l'ai trouvé avant, donc je veux montrer quelle solution j'ai trouvée).


Il s'est avéré que l'essence est banalement simple, mais présente tout de même un inconvénient - cette fonction ne reconnaît pas les zéros, si après eux il n'y a pas d'autres chiffres. Par exemple, cette fonction renvoie 2 lorsqu'elle est suivie de 0,01, mais lorsqu'elle est suivie de 0,0000, elle renvoie 0 (ce qui signifie qu'elle ne peut pas voir quatre zéros). Tenez donc compte de cette lacune dans vos développements.


Code en MQL4


Le code à MQL5

Le code MQL5 a dû être légèrement amélioré, car apparemment dans MQL5 les variables de type double se voient automatiquement attribuer 0 à la fin, que la variable soit un entier ou non. Pour cette raison, la fonction n'a jamais retourné 0.

après
string string_value = (string)value;

ne lisez pas plus loin :-)

 
Vitaly Muzichenko:

Supposons que nous donnions le nombre 2.4875, la fonction retournera 4.

Qu'est-ce qu'on en fait ? Je n'ai pas l'impression d'avoir compris.

En fonction de qui a besoin de quoi. Par exemple, j'avais besoin d'entiers pour calculer plus facilement l'indice de corrélation

 
Maxim Kuznetsov:

vous n'avez pas besoin de lire plus loin :-)

Qu'est-ce qui n'est pas clair pour un programmeur ici).

 
Au contraire, il existe une fonction StringFind(), il n'est pas nécessaire de parcourir les caractères en boucle pour le trouver.
 
Dmitry Fedoseev:
Au contraire, il existe une fonction StringFind(), il n'est pas nécessaire de parcourir les caractères en boucle pour le trouver.

merci

 

Retiré

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

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

    Res++;
  }

  return(Res);
}
 
fxsaber:
Extrait de

également une bonne solution

 
Alexandr Sokolov:

également une bonne solution

Une bonne solution fonctionne généralement correctement

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

Résultat : 500000000.0001:8

Combien de chiffres après le point décimal ? Est-il vraiment 8 ?

 
A100:

Une bonne solution fonctionne généralement correctement

Résultat : 500000000.0001:8

Combien de chiffres après le point décimal ? Est-ce que c'est vraiment huit ?

Oui, huit.