Obtener el número de decimales de cualquier número (no sólo las comillas) evitando Digits() en MQL4 y MQL5

 

Creo que no soy el único que ha tenido una situación rara en la que necesitaba obtener el número de decimales, y la función Digits() sólo funciona con comillas, y además no hay información al respecto en ningún sitio (al menos en el momento de escribir este post no la he encontrado antes, así que quiero mostrar la solución que he encontrado).


Al final resultó que, la esencia de la simple banal, pero todavía tiene un inconveniente - esta función no reconoce los ceros, si después de ellos no hay otros dígitos. Por ejemplo, esta función devolverá 2 cuando vaya seguida de 0,01, pero cuando vaya seguida de 0,0000 devolverá 0 (lo que significa que no puede ver cuatro ceros). Por lo tanto, considere esta carencia en sus desarrollos.


Código 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);
  }


El código en 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);
  }

El código de MQL5 tuvo que ser ligeramente mejorado, ya que aparentemente en MQL5 a las variables de tipo doble se les asigna automáticamente 0 al final, sin importar si la variable es un entero o no. Por esta razón, la función nunca ha devuelto 0

 
Alexandr Sokolov:

Creo que no soy el único que ha tenido una situación rara en la que necesitaba obtener el número de decimales, y la función Digits() sólo funciona con comillas, y además no hay información al respecto en ningún sitio (al menos en el momento de escribir este post la he encontrado antes, por eso quiero mostrar la solución que he encontrado).

Resultó que la esencia es banalmente simple, pero todavía tiene un inconveniente - esta función no reconoce los ceros, si después de ellos no hay otros dígitos. Por ejemplo, la función devolverá 2 cuando vaya seguida de 0,01, pero cuando vaya seguida de 0,0000 devolverá 0 (lo que significa que no puede ver cuatro ceros). Por lo tanto, debe tener en cuenta esta carencia en sus desarrollos.

El código en MQL5 tuvo que ser ligeramente mejorado, ya que aparentemente en MQL5 las variables de tipo doble son automáticamente asignadas , 0 al final, sin importar si la variable es asignada a un entero o no. Por esta razón, la función nunca ha devuelto 0.

Supongamos que damos el número 2,4875 y la función devuelve 4.

¿Qué debemos hacer con él? Algo que no entiendo el punto de(

 
Alexandr Sokolov:

Creo que no soy el único que ha tenido una situación rara en la que necesitaba obtener el número de decimales, y la función Digits() sólo funciona con comillas, y además no hay información al respecto en ningún sitio (al menos en el momento de escribir este post la he encontrado antes, por eso quiero mostrar la solución que he encontrado).


Resultó que la esencia es banalmente simple, pero todavía tiene un inconveniente - esta función no reconoce los ceros, si después de ellos no hay otros dígitos. Por ejemplo, esta función devolverá 2 cuando vaya seguida de 0,01, pero cuando vaya seguida de 0,0000 devolverá 0 (lo que significa que no puede ver cuatro ceros). Por lo tanto, considere esta carencia en sus desarrollos.


Código en MQL4


El código en MQL5

El código de MQL5 tuvo que ser ligeramente mejorado, ya que aparentemente en MQL5 a las variables de tipo doble se les asigna automáticamente 0 al final, sin importar si la variable es un entero o no. Por esta razón, la función nunca ha devuelto 0.

después de
string string_value = (string)value;

no sigas leyendo :-)

 
Vitaly Muzichenko:

Supongamos que damos el número 2,4875, la función devolverá 4.

¿Qué hacemos con él? Parece que no entiendo el punto(

Dependiendo de quién necesite qué. Por ejemplo, necesitaba números enteros para calcular más fácilmente el índice de correlación

 
Maxim Kuznetsov:

no hace falta que sigas leyendo :-)

¿Qué es lo que no está claro para un programador aquí?)

 
En todo caso, hay una función StringFind(), no es necesario hacer un bucle a través de los caracteres para encontrarlo.
 
Dmitry Fedoseev:
En todo caso, hay una función StringFind(), no es necesario hacer un bucle a través de los caracteres para encontrarlo.

gracias

 

Sacado

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

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

    Res++;
  }

  return(Res);
}
 
fxsaber:
Extraído de

también es una buena solución

 
Alexandr Sokolov:

también es una buena solución

Una buena solución suele funcionar correctamente

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

Resultado: 500000000.0001:8

¿Cuántos dígitos después del punto decimal? ¿Realmente son 8?

 
A100:

Una buena solución suele funcionar correctamente

Resultado: 500000000.0001:8

¿Cuántos dígitos después del punto decimal? ¿Realmente son ocho?

Sí, ocho.