Ottenere il numero di posizioni decimali di qualsiasi numero (non solo le virgolette) bypassando Digits() in MQL4 e MQL5

 

Penso di non essere l'unico che ha avuto una rara situazione in cui avevo bisogno di ottenere il numero di cifre decimali, e la funzione Digits() funziona solo con le virgolette, e inoltre non ci sono informazioni al riguardo da nessuna parte (almeno al momento di scrivere questo post non le ho trovate prima, quindi voglio mostrare quale soluzione ho trovato).


Come si è scoperto, l'essenza del semplice banale, ma ha ancora un inconveniente - questa funzione non riconosce gli zeri, se dopo di loro non ci sono altre cifre. Per esempio, la funzione restituirà 2 se seguita da 0,01, ma se seguita da 0,0000 restituirà 0 (cioè non può vedere quattro zeri). Quindi, considerate questa lacuna nei vostri sviluppi.


Codice in 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);
  }


Il codice di 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);
  }

Il codice MQL5 ha dovuto essere leggermente migliorato, perché apparentemente in MQL5 alle variabili di tipo doppio viene automaticamente assegnato 0 alla fine, non importa se la variabile è un intero o no. Per questo motivo, la funzione non ha mai restituito 0

 
Alexandr Sokolov:

Penso di non essere l'unico che ha avuto una rara situazione in cui avevo bisogno di ottenere il numero di cifre decimali, e la funzione Digits() funziona solo con le virgolette, e inoltre non ci sono informazioni al riguardo da nessuna parte (almeno al momento di scrivere questo post l'ho trovato prima, quindi voglio mostrare quale soluzione ho trovato).

Come si è scoperto l'essenza è banalmente semplice, ma ha ancora un inconveniente - questa funzione non riconosce gli zeri, se dopo di loro non ci sono altre cifre. Per esempio, questa funzione restituirà 2 quando è seguita da 0,01, ma quando è seguita da 0,0000 restituirà 0 (il che significa che non può vedere quattro zeri). Pertanto, dovreste considerare questa lacuna nei vostri sviluppi.

Il codice in MQL5 ha dovuto essere leggermente migliorato, poiché apparentemente in MQL5 le variabili di tipo doppio sono automaticamente assegnate , 0 alla fine, non importa se la variabile è assegnata ad un intero o meno. Per questo motivo, la funzione non ha mai restituito 0.

Supponiamo di dare il numero 2,4875 e la funzione restituisce 4.

Cosa dovremmo farne? Qualcosa che non capisco il senso di(

 
Alexandr Sokolov:

Penso di non essere l'unico che ha avuto una rara situazione in cui avevo bisogno di ottenere il numero di cifre decimali, e la funzione Digits() funziona solo con le virgolette, e inoltre non ci sono informazioni al riguardo da nessuna parte (almeno al momento di scrivere questo post l'ho trovato prima, quindi voglio mostrare quale soluzione ho trovato).


Come si è scoperto l'essenza è banalmente semplice, ma ha ancora un inconveniente - questa funzione non riconosce gli zeri, se dopo di loro non ci sono altre cifre. Per esempio, questa funzione restituirà 2 se seguita da 0,01, ma se seguita da 0,0000 restituirà 0 (il che significa che non può vedere quattro zeri). Quindi, considerate questa lacuna nei vostri sviluppi.


Codice in MQL4


Il codice di MQL5

Il codice MQL5 ha dovuto essere leggermente migliorato, perché apparentemente in MQL5 alle variabili di tipo doppio viene automaticamente assegnato 0 alla fine, non importa se la variabile è un intero o no. Per questo motivo, la funzione non ha mai restituito 0.

dopo
string string_value = (string)value;

non leggere oltre :-)

 
Vitaly Muzichenko:

Supponiamo di dare il numero 2,4875, la funzione restituirà 4.

Cosa ne facciamo? Non mi sembra di aver capito il senso di tutto questo.

A seconda di chi ha bisogno di cosa. Per esempio avevo bisogno di numeri interi per calcolare più facilmente l'indice di correlazione

 
Maxim Kuznetsov:

non hai bisogno di leggere oltre :-)

Cosa non è chiaro per un programmatore qui?)

 
Semmai, c'è una funzione StringFind(), non c'è bisogno di fare un loop tra i caratteri per trovarlo.
 
Dmitry Fedoseev:
Semmai, c'è una funzione StringFind(), non c'è bisogno di fare un loop tra i caratteri per trovarlo.

grazie

 

Tirato fuori

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

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

    Res++;
  }

  return(Res);
}
 
fxsaber:
Estratto da

anche una buona soluzione

 
Alexandr Sokolov:

anche una buona soluzione

Una buona soluzione di solito funziona bene

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

Risultato: 500000000.0001:8

Quante cifre dopo il punto decimale? Sono davvero 8?

 
A100:

Una buona soluzione di solito funziona bene

Risultato: 500000000.0001:8

Quante cifre dopo il punto decimale? Sono davvero otto?

Sì, otto.