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

 
Igor Makanu:

No, no funcionará...

Ah, cierto, se me olvidaba que se hizo a sabiendas para números menores que cero, ya que se utilizó en la normalización de lotes. Lo arreglé, ahora está bien:

#define  EPSILON   0.000000001
#define  MORE(A,B) ((A)-(B)>EPSILON)

int Digit(double value)
  {
   int digits=0;
   value=MathMod(value,1.0);
   while(MORE(1.0/MathPow(10,digits),value)) 
      digits++;
   return(digits);
  }
//+------------------------------------------------------------------+
int DoubleToDigits(double value)
 {
   double absvalue=NormalizeDouble(fabs(value-int(value)),15);
   int res=StringLen(string(absvalue))-2;
   return(res<=0?0:res);
 }
//+------------------------------------------------------------------+
void OnStart()
  {
   double f = 122334550.007;
   Print("1. DoubleToDigits() = ",DoubleToDigits(f));
   Print("1. Digit() = ",Digit(f));
   f = 0.007;
   Print("2. DoubleToDigits() = ",DoubleToDigits(f));
   Print("2. Digit() = ",Digit(f));
  }  

Resultado:

2018.11.13 05:18:40.599 Digits (EURUSD,M1)      1. DoubleToDigits() = 11
2018.11.13 05:18:40.599 Digits (EURUSD,M1)      1. Digit() = 3
2018.11.13 05:18:40.599 Digits (EURUSD,M1)      2. DoubleToDigits() = 3
2018.11.13 05:18:40.599 Digits (EURUSD,M1)      2. Digit() = 3
 
Invertiré el dinero que gane con el forex en un bar Jolly Trader. Lo abriré en Londres.
 
Konstantin Gruzdev:

Ah, cierto, se me olvidaba que se hizo a sabiendas para números menores que cero, ya que se utilizó en la normalización de lotes. Lo arreglé, ahora está bien:

Resultado:

No, no funcionó.

doble f = 122334550.00999;

Resultado:

2018.11.13 02:36:31.034 tst (EURUSD,M30) 1. Dígito() = 3


 
Señor, da a los hijos de estas personas la oportunidad de aprender física.
 
Igor Makanu:

No, no funcionó.

Ah, claro, ya veo lo que está mal. Lo arreglaré.

 
Алексей Тарабанов:
Señor, dale a los hijos de estas personas la oportunidad de aprender física.

¿Por qué, si los padres pueden prescindir de ella?

 

En primer lugar, contéstate a ti mismo: ¿por qué necesitas saber cuántos dígitos hay después del punto decimal? ¿Para hacer qué?

La única forma adecuada de utilizar el "doble con dígitos" es utilizarlo con alguna precisión determinada , conocida de antemano dentro del problema a resolver.

Todo lo demás son tonterías.

Ni siquiera hablo del hecho de que cuanto mayor sea el valor del doble módulo, menos preciso será y cualquier algoritmo (especialmente con la conversión de cadenas, que está fuera de los límites) la cagará.

 
Mesaoria:

(especialmente con la conversión a cadena, está fuera de línea) fallará.

estos son códigos para MQL, no para C++ estándar, es obvio que en C++ el manejo de cadenas será lento, en MQL las funciones incorporadas son más rápidas que las funciones escritas por uno mismo

 
Igor Makanu:

Este es un código para MQL, no para C++ estándar, es obvio que en C++ el manejo de cadenas será lento, en MQL las funciones incorporadas son más rápidas que las funciones escritas por uno mismo

No es eso lo que quería decir. La idea de convertir un duble en una cadena y luego calcular todos los caracteres que contiene es una chorrada. Hagas lo que hagas.

 
Mesaoria:

No me refería a eso en absoluto. La idea de convertir un duble en una cadena para luego poder contar los caracteres de la cadena es un completo disparate. No importa lo que hagas.

Sí, mi versión probablemente no es la mejor, pero como nunca he encontrado nada al respecto, es la mejor que se me ocurrió por mi cuenta, escribí sobre ella en los comentarios anteriores, y tú nunca sugeriste tu propia versión.
Razón de la queja: