Redondear números en MT4 mediante NormalizeDouble - página 13

 
Алексей Тарабанов:
El diablo está en la mezcla... 2,6, por supuesto.
es hora de ir a la cama.
 
lilita bogachkova:
Es hora de ir a la cama.
Entrar en
 
Dmitry Fedoseev:
¿Qué es el 5? La normalización de un número de este tipo convierte todos los 9 en ceros, por lo que normalizar y luego descartar dará resultados erróneos.
DoubleToString(0.99999,5)
 
Vasyl Nosal:
DoubleToString(0.99999,5)

¿Y si el número es 0,99999 y hay que dejar dos dígitos? Descarta el resto. Tenemos que conseguir 0,99. Así que lo normalizamos a tres dígitos, obtenemos 1,000, descartamos uno y obtenemos 1,00, pero no 0,99.

 
Dmitry Fedoseev:

¿Y si el número es 0,99999 y hay que dejar dos dígitos? Descarta el resto. Tenemos que conseguir 0,99. Así que lo normalizamos a tres dígitos, obtenemos 1,000, descartamos uno y obtenemos 1,00, pero no 0,99.

extern ushort Characters_delete = 3;

///////////////////////////////////////////
string data=DoubleToString(0.99999,5); 
string resoult=StringSubstr(data,0,StringLen(data)-Characters_delete);
 
Vasyl Nosal:
Sí... y de repente tenemos el número 0,999999 en lugar de 0,999999.
 
Dmitry Fedoseev:
Sí... y de repente tenemos 0,999999 en lugar de 0,999999.
string(0.999999)
 
Me recuerda a la anécdota del programador desaparecido. Y está sentado en un baño frío, con el champú en las manos y las instrucciones "enjabonar, aclarar, repetir".
 
Dmitry Fedoseev:
Me recuerda a un chiste sobre un programador que ha desaparecido. Estaba sentado en una bañera fría, con champú en las manos y la instrucción "enjabonar, aclarar y repetir".
¿Por qué un lenguaje necesita tanta precisión: que el número (por ejemplo) "0,7" se almacene realmente como "0,69999..."?
¿Se utiliza esto realmente en alguna parte? Estoy acostumbrado a contar los números como en una calculadora, se muestra con precisión.
Sí, quizás la propia calculadora redondea algo, y no guarda los números exactos por sí misma...
¿Quién necesita utilizar cifras tan aproximadas con fracciones infinitas en lugar de valores exactos?
Divídelo, obtén 0,7 y no te molestes en recortar o redondear :-)
 
Dmitry Fedoseev:

¿Y si el número es 0,99999 y hay que dejar dos dígitos? Descarta el resto. Tenemos que conseguir 0,99. Así, según el algoritmo sugerido anteriormente, normalizar a tres dígitos, obtenemos 1,000, descartar uno y obtener 1,00, pero no 0,99.

intente obtener un resultado de0,99999999999999999

X = 0.99999999999999999

10*X = 10*0.99999999999999999

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

9*X = 9*0.99999999999999999

obtenemos 9*X = 9 o X es igual a 1 (uno)

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

o 0,9999999999999 = 1,0

void OnStart()
  {
      double v1=0.99999999999999999;

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

v1 (1.00000000) >= 1.0