Obter o número de casas decimais de quaisquer números (não apenas citações) contornando Dígitos() em MQL4 e MQL5 - página 8

 
Igor Makanu:

Não, não vai funcionar...

Ah, certo, esqueci que foi feito conscientemente para números inferiores a zero, pois foi usado na normalização de lotes. Consertado, agora está tudo bem:

#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
 
Investirei o dinheiro que ganho com forex em um bar Jolly Trader. Vou abri-lo em Londres.
 
Konstantin Gruzdev:

Ah, certo, esqueci que foi feito conscientemente para números inferiores a zero, pois foi usado na normalização de lotes. Consertado, agora está tudo bem:

Resultado:

não, não funcionou.

duplo f = 122334550.00999;

Resultado:

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


 
Senhor, dê aos filhos dessas pessoas a oportunidade de aprender física.
 
Igor Makanu:

Não, não funcionou.

Ah, certo, estou vendo o que está errado. Eu vou consertar isso.

 
Алексей Тарабанов:
Senhor, dê aos filhos dessas pessoas a oportunidade de aprender física.

Por que, quando os pais podem passar sem ele?

 

Primeiro, responda a si mesmo - por que você precisa saber quantos dígitos após o ponto decimal? Para fazer o que?

A única maneira adequada de usar "duplo com dígitos" é usá-lo com alguma precisão dada , conhecida antecipadamente dentro do problema a ser resolvido.

Tudo o resto é um absurdo.

Não estou nem mesmo falando do fato de que quanto maior o valor do módulo duplo, menos preciso ele é e qualquer algoritmo (especialmente com a conversão de cordas, que está fora dos limites) irá falhar.

 
Mesaoria:

(especialmente com a conversão em cordel, está fora de linha) falhará.

estes são códigos para MQL, não para C++ padrão, é óbvio que em C++ o manuseio de cordas será lento, em MQL as funções embutidas são mais rápidas do que as funções autoescritas

 
Igor Makanu:

Isto é código para MQL, não para C++ padrão, é óbvio que em C++ o manuseio de strings será lento, em MQL as funções embutidas são mais rápidas do que as funções autoescritas

Não era isso que eu queria dizer. A idéia de converter um duble em uma corda e depois calcular todos os caracteres nela contidos é apenas um monte de porcaria. O que quer que você faça.

 
Mesaoria:

Não era nada disso que eu estava falando. A idéia de converter um duble em uma corda para que você possa então contar os caracteres da corda é um completo absurdo. Não importa o que você faça.

Sim, minha versão provavelmente não é a melhor, mas como nunca encontrei nada sobre ela - é a melhor que pude pensar por conta própria, escrevi sobre ela nos comentários acima, e você nunca sugeriu sua própria versão.
Razão: