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

 

Acho que não sou o único que teve uma situação rara em que precisei obter o número de casas decimais, e a função Dígitos() funciona apenas com citações, e além disso não há informações sobre isso em nenhum lugar (pelo menos na hora de escrever este post eu não o encontrei antes, então quero mostrar que solução encontrei).


Como se viu, a essência do banal é simples, mas ainda tem uma desvantagem - esta função não reconhece zeros, se depois deles não houver outros dígitos. Por exemplo, a função retornará 2 quando seguida de 0,01, mas quando seguida de 0,0000 retornará 0 (ou seja, não pode ver quatro zeros). Portanto, considere esta lacuna em seus desenvolvimentos.


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


O código na 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);
  }

O código MQL5 teve que ser ligeiramente melhorado, já que aparentemente em MQL5 variáveis de tipo duplo são automaticamente atribuídas 0 no final, não importa se a variável é um número inteiro ou não. Por este motivo, a função nunca retornou 0

 
Alexandr Sokolov:

Acho que não sou o único que tinha uma situação rara onde eu precisava obter o número de casas decimais, e a função Dígitos() funciona apenas com citações, e além disso não há informações sobre isso em nenhum lugar (pelo menos na hora de escrever este post eu o encontrei antes, então eu quero mostrar que solução encontrei).

A essência é banalmente simples, mas ainda tem uma desvantagem - esta função não reconhece zeros, se depois deles não houver outros dígitos. Por exemplo, a função retornará 2 quando seguida por 0,01, mas quando seguida por 0,0000 retornará 0 (o que significa que não pode ver quatro zeros). Portanto, você deve considerar esta lacuna em seus desenvolvimentos.

O código na MQL5 teve que ser ligeiramente melhorado, pois aparentemente na MQL5 variáveis de tipo duplo são automaticamente atribuídas , 0 no final, não importando se a variável é atribuída a um número inteiro ou não. Por este motivo, a função nunca retornou 0.

Suponha que damos o número 2.4875 e a função retorna 4.

O que devemos fazer com ele? Algo que eu não entendo o objetivo de(

 
Alexandr Sokolov:

Acho que não sou o único que tinha uma situação rara onde eu precisava obter o número de casas decimais, e a função Dígitos() funciona apenas com citações, e além disso não há informações sobre isso em nenhum lugar (pelo menos na hora de escrever este post eu o encontrei antes, então eu quero mostrar que solução encontrei).


A essência é banalmente simples, mas ainda tem uma desvantagem - esta função não reconhece zeros, se depois deles não houver outros dígitos. Por exemplo, esta função retornará 2 quando seguida por 0,01, mas quando seguida por 0,0000 retornará 0 (o que significa que não pode ver quatro zeros). Portanto, considere esta lacuna em seus desenvolvimentos.


Código em MQL4


O código na MQL5

O código MQL5 teve que ser ligeiramente melhorado, já que aparentemente em MQL5 variáveis de tipo duplo são automaticamente atribuídas 0 no final, não importa se a variável é um número inteiro ou não. Por este motivo, a função nunca retornou 0.

depois de
string string_value = (string)value;

não leia mais :-)

 
Vitaly Muzichenko:

Suponhamos que damos o número 2.4875, a função retornará 4.

O que fazemos com ele? Parece que não estou entendendo o ponto(

Dependendo de quem precisa do quê. Por exemplo, eu precisava de inteiros para calcular mais facilmente o índice de correlação

 
Maxim Kuznetsov:

você não precisa ler mais :-)

O que não está claro para um programador aqui?)

 
Se existe alguma função StringFind(), não há necessidade de fazer um loop através dos caracteres para encontrá-la.
 
Dmitry Fedoseev:
Se existe alguma função StringFind(), não há necessidade de fazer um loop através dos caracteres para encontrá-la.

obrigado

 

Tirado para fora

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

também uma boa solução

 
Alexandr Sokolov:

também uma boa solução

Uma boa solução geralmente funciona corretamente

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

Resultado: 500000000.0001:8

Quantos dígitos após o ponto decimal? É realmente 8 ?

 
A100:

Uma boa solução geralmente funciona corretamente

Resultado: 500000000.0001:8

Quantos dígitos após o ponto decimal? São realmente oito?

Sim, oito.

Razão: