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

 
Igor Makanu:

No, non funzionerà...

Oh, giusto, ho dimenticato che è stato fatto consapevolmente per i numeri inferiori a zero, in quanto è stato utilizzato nella normalizzazione dei lotti. L'ho aggiustato, ora è ok:

#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));
  }  

Risultato:

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
 
Investirò i soldi che faccio con il forex in un bar Jolly Trader. Lo aprirò a Londra.
 
Konstantin Gruzdev:

Oh, giusto, ho dimenticato che è stato fatto consapevolmente per i numeri inferiori a zero, in quanto è stato utilizzato nella normalizzazione dei lotti. L'ho aggiustato, ora è ok:

Risultato:

No, non ha funzionato.

doppio f = 122334550.00999;

Risultato:

2018.11.13 02:36:31.034 tst (EURUSD,M30) 1. Cifra() = 3


 
Signore, dai ai figli di queste persone l'opportunità di imparare la fisica.
 
Igor Makanu:

No, non ha funzionato.

Oh, giusto, ho capito cosa c'è di sbagliato, lo sistemerò.

 
Алексей Тарабанов:
Signore, dai ai figli di queste persone la possibilità di imparare la fisica.

Perché, quando i genitori possono farne a meno?

 

Per prima cosa, rispondete a voi stessi - perché avete bisogno di sapere quante cifre dopo la virgola decimale? Per fare cosa?

L'unico modo corretto di usare il "doppio con cifre" è quello di usarlo con una certa precisione data , conosciuta in anticipo all'interno del problema da risolvere.

Tutto il resto è una sciocchezza.

Non sto nemmeno parlando del fatto che maggiore è il valore del doppio modulo, meno accurato è e qualsiasi algoritmo (specialmente con la conversione delle stringhe, che è fuori dai limiti) fallirà.

 
Mesaoria:

(specialmente con la conversione in stringa, è fuori linea) fallirà.

questi sono codici per MQL, non per il C++ standard, è ovvio che in C++ la gestione delle stringhe sarà lenta, in MQL le funzioni integrate sono più veloci delle funzioni auto-scritte

 
Igor Makanu:

Questo è il codice per MQL, non per il C++ standard, è ovvio che in C++ la gestione delle stringhe sarà lenta, in MQL le funzioni integrate sono più veloci delle funzioni auto-scritte

Non è quello che intendevo. L'idea di convertire un duble in una stringa e poi calcolare tutti i caratteri che ci sono dentro è solo un mucchio di stronzate. Qualunque cosa tu faccia.

 
Mesaoria:

Non è affatto quello di cui stavo parlando. L'idea di convertire un duble in una stringa in modo da poter poi contare i caratteri nella stringa è una completa assurdità. Non importa cosa fai.

Sì, la mia versione probabilmente non è la migliore, ma dato che non ho mai trovato nulla al riguardo - è la migliore che mi è venuta in mente per conto mio, ne ho scritto nei commenti sopra, e tu non hai mai suggerito la tua versione.