Arrondir les nombres dans MT4 via NormalizeDouble - page 13

 
Алексей Тарабанов:
Le diable est dans le mélange... 2.6, bien sûr.
c'est l'heure de se coucher.
 
lilita bogachkova:
C'est l'heure de se coucher.
Rejoindre
 
Dmitry Fedoseev:
Qu'est-ce qui est 5 ? La normalisation d'un tel nombre transforme tous les 9 en zéros, donc le fait de normaliser puis d'écarter donnera des résultats erronés.
DoubleToString(0.99999,5)
 
Vasyl Nosal:
DoubleToString(0.99999,5)

Et si le nombre est 0,99999 et que vous devez laisser deux chiffres ? Jetez le reste. Nous devons obtenir 0,99. Nous le normalisons donc à trois chiffres, obtenons 1,000, en éliminons un, et obtenons 1,00, mais pas 0,99.

 
Dmitry Fedoseev:

Et si le nombre est 0,99999 et que vous devez laisser deux chiffres ? Jetez le reste. Nous devons obtenir 0,99. Nous le normalisons donc à trois chiffres, obtenons 1,000, en éliminons un, et obtenons 1,00, mais pas 0,99.

extern ushort Characters_delete = 3;

///////////////////////////////////////////
string data=DoubleToString(0.99999,5); 
string resoult=StringSubstr(data,0,StringLen(data)-Characters_delete);
 
Vasyl Nosal:
Oui... et soudain on a le nombre 0,999999 au lieu de 0,999999.
 
Dmitry Fedoseev:
Oui... et soudain on a le nombre 0,999999 au lieu de 0,999999.
string(0.999999)
 
Cela me rappelle l'anecdote du programmeur disparu. Et il est assis dans un bain froid, du shampooing dans les mains avec les instructions "savon, rinçage, répétition".
 
Dmitry Fedoseev:
Cela me rappelle une blague sur un programmeur qui a disparu. Il était assis dans un bain froid, du shampoing dans les mains avec l'instruction "savonner, rincer et répéter".
Pourquoi une langue a-t-elle besoin d'une telle précision : que le nombre (par exemple) "0,7" soit en fait stocké comme "0,69999..." ?
Est-ce que cela est utilisé quelque part ? J'ai l'habitude de compter les chiffres comme dans une calculatrice, ça donne des résultats précis.
Oui, peut-être que la calculatrice elle-même arrondit quelque chose, et ne stocke pas elle-même les chiffres exacts...
Qui a besoin d'utiliser de tels chiffres approximatifs avec des fractions infinies au lieu de valeurs exactes ?
Divisez-le, obtenez 0,7 et ne vous embêtez pas à recadrer ou arrondir :-)
 
Dmitry Fedoseev:

Et si le nombre est 0,99999 et que vous devez laisser deux chiffres ? Jetez le reste. Nous devons obtenir 0,99. Ainsi, selon l'algorithme proposé ci-dessus, en normalisant à trois chiffres, on obtient 1,000, on en écarte un et on obtient 1,00, mais pas 0,99.

essayez d'obtenir un résultat de0.999999999999999999999

X = 0.99999999999999999

10*X = 10*0.99999999999999999

10*X-X = 10*0,999999999999999-0,9999999999999

9*X = 9*0.99999999999999999

nous obtenons 9*X = 9 ou X est égal à 1 (un)

void OnStart()
  {
      double v1=1.0/3.0;
      double v2=3.0*v1;

      Print("v1 = (1/3) = ",DoubleToString(v1)," | ","v2 = 3*(1/3) = ",DoubleToString(v2));
  }

v1 = (1/3) = 0,33333333 | v2 = 3*(1/3) = 1,00000000

ou 0.99999999999999999 = 1.0

void OnStart()
  {
      double v1=0.99999999999999999;

      if(v1>=1.0)
         Print("v1 (",DoubleToString(v1),") >= 1.0");
  }

v1 (1.00000000) >= 1.0

Raison: