Obtenir le nombre de décimales de n'importe quel nombre (pas seulement les guillemets) en contournant Digits() dans MQL4 et MQL5 - page 8

 
Igor Makanu:

Non, ça ne marchera pas...

Oh, c'est vrai, j'ai oublié qu'il a été fait sciemment pour les nombres inférieurs à zéro, car il a été utilisé dans la normalisation des lots. Je l'ai corrigé, maintenant c'est bon :

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

Résultat :

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
 
Je vais investir l'argent que je gagne avec le forex dans un bar Jolly Trader. Je vais l'ouvrir à Londres.
 
Konstantin Gruzdev:

Oh, c'est vrai, j'ai oublié qu'il a été fait sciemment pour les nombres inférieurs à zéro, car il a été utilisé dans la normalisation des lots. Je l'ai corrigé, maintenant c'est bon :

Résultat :

Non, ça n'a pas marché.

double f = 122334550.00999 ;

Résultat :

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


 
Seigneur, donne aux enfants de ces gens la possibilité d'apprendre la physique.
 
Igor Makanu:

Non, ça n'a pas marché.

Oh, d'accord, je vois ce qui ne va pas. Je vais arranger ça.

 
Алексей Тарабанов:
Seigneur, donne aux enfants de ces gens la chance d'apprendre la physique.

Pourquoi, alors que les parents peuvent s'en passer ?

 

Tout d'abord, répondez à la question suivante : pourquoi avez-vous besoin de connaître le nombre de chiffres après la virgule ? Pour faire quoi ?

La seule façon correcte d'utiliser "double avec chiffres" est de l'utiliser avec une certaine précision, connue à l'avance dans le cadre du problème à résoudre.

Tout le reste est absurde.

Je ne parle même pas du fait que plus la valeur du double modulo est grande, moins elle est précise et que tout algorithme (surtout avec la conversion de chaînes de caractères, qui est hors limites) échouera.

 
Mesaoria:

(surtout avec la conversion en chaîne, c'est hors de propos) échouera.

il s'agit de codes pour MQL, pas pour le C++ standard, il est évident qu'en C++ la gestion des chaînes de caractères sera lente, en MQL les fonctions intégrées sont plus rapides que les fonctions auto-écrites.

 
Igor Makanu:

Il s'agit d'un code pour MQL, pas pour le C++ standard, il est évident qu'en C++ la gestion des chaînes de caractères sera lente, en MQL les fonctions intégrées sont plus rapides que les fonctions auto-écrites.

Ce n'est pas ce que je voulais dire. L'idée de convertir un double en une chaîne de caractères et de calculer ensuite tous les caractères qu'elle contient est tout simplement absurde. Quoi que vous fassiez.

 
Mesaoria:

Ce n'est pas du tout ce dont je parlais. L'idée de convertir un double en une chaîne de caractères afin de pouvoir ensuite compter les caractères de cette chaîne est une absurdité totale. Peu importe ce que vous faites.

Oui, ma version n'est probablement pas la meilleure, mais comme je n'ai jamais rien trouvé à ce sujet - c'est la meilleure que j'ai pu imaginer par moi-même, j'en ai parlé dans les commentaires ci-dessus, et vous n'avez jamais proposé votre propre version.