Arredondamento de números em MT4 via NormalizeDouble - página 13

 
Алексей Тарабанов:
O diabo está na mistura... 2.6, é claro.
está na hora de dormir.
 
lilita bogachkova:
É hora de dormir.
Juntando-se a
 
Dmitry Fedoseev:
O que é 5? A normalização de tal número transforma todos os 9's em zeros, então a normalização e depois o descarte darão resultados errados.
DoubleToString(0,99999,5)
 
Vasyl Nosal:
DoubleToString(0,99999,5)

Bem, e se o número for 0,99999 e você tiver que deixar dois dígitos? Descarte o resto. Precisamos de 0,99. Assim, de acordo com o algoritmo sugerido acima, normalizar para três dígitos, recebemos 1.000, descartar um e receber 1,00, mas não 0,99.

 
Dmitry Fedoseev:

Bem, e se o número for 0,99999 e você tiver que deixar dois dígitos? Descarte o resto. Precisamos de 0,99. Assim, normalizamos para três dígitos, obtemos 1.000, descartamos um e obtemos 1,00, mas não 0,99.

extern ushort Characters_delete = 3;

///////////////////////////////////////////
string data=DoubleToString(0.99999,5); 
string resoult=StringSubstr(data,0,StringLen(data)-Characters_delete);
 
Vasyl Nosal:
Sim... e de repente temos o número 0,99999999 em vez de 0,99999999.
 
Dmitry Fedoseev:
Sim... e de repente temos o número 0,99999999 em vez de 0,99999999.
string(0.999999)
 
Isso me lembra a anedota sobre o programador desaparecido. E ele está sentado em um banho frio, xampu em suas mãos com as instruções "sabonete, enxágüe, repita".
 
Dmitry Fedoseev:
Isso me lembra uma piada sobre um programador que desapareceu. Ele estava sentado em um banho frio, xampu em suas mãos com a instrução "sabonete, enxágüe e repita".
Por que uma linguagem precisa de tal precisão: que o número (por exemplo) "0,7" seja realmente armazenado como "0,69999..."?
Isto é realmente usado em algum lugar? Estou acostumado a contar números como em uma calculadora, ela mostra com precisão.
Sim, talvez a calculadora em si dê a volta a algo, e não armazene os números exatos em si.
Quem precisa usar esses valores aproximados com frações infinitas ao invés de valores exatos?
Divida, obtenha 0,7 e não se preocupe com o corte ou arredondamento :-)
 
Dmitry Fedoseev:

Bem, e se o número for 0,99999 e você tiver que deixar dois dígitos? Descarte o resto. Precisamos de 0,99. Assim, de acordo com o algoritmo sugerido acima, normalizar para três dígitos, recebemos 1.000, descartar um e receber 1,00, mas não 0,99.

tente obter um resultado de0,99999999999999999999999

X = 0.99999999999999999

10*X = 10*0.99999999999999999

10*X-X = 10*0,999999999999999999999-0,99999999999999999

9*X = 9*0.99999999999999999

obtemos 9*X = 9 ou X igual a 1 (um)

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,9999999999999999999 = 1,0

void OnStart()
  {
      double v1=0.99999999999999999;

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

v1 (1.00000000) >= 1.0