Arrotondamento dei numeri in MT4 tramite NormalizeDouble - pagina 13

 
Алексей Тарабанов:
Il diavolo è nella miscela... 2.6, ovviamente.
è ora di andare a letto.
 
lilita bogachkova:
È ora di andare a letto.
Raggiungere
 
Dmitry Fedoseev:
Cos'è il 5? Normalizzare un tale numero trasforma tutti i 9 in zeri, quindi normalizzare e poi scartare darà risultati sbagliati.
DoubleToString(0.99999,5)
 
Vasyl Nosal:
DoubleToString(0.99999,5)

E se il numero è 0,99999 e dovete lasciare due cifre? Scartare il resto. Dobbiamo ottenere 0,99. Quindi, secondo l'algoritmo suggerito sopra, normalizziamo a tre cifre, otteniamo 1.000, ne scartiamo una e otteniamo 1.00, ma non 0.99.

 
Dmitry Fedoseev:

E se il numero è 0,99999 e dovete lasciare due cifre? Scartare il resto. Dobbiamo ottenere 0,99. Quindi lo normalizziamo a tre cifre, otteniamo 1.000, ne scartiamo una e otteniamo 1.00, ma non 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ì... e improvvisamente abbiamo il numero 0,999999 invece di 0,999999.
 
Dmitry Fedoseev:
Sì... e improvvisamente abbiamo il numero 0,999999 invece di 0,999999.
string(0.999999)
 
Mi ricorda l'aneddoto del programmatore scomparso. Ed è seduto in un bagno freddo, con lo shampoo in mano con le istruzioni "insapona, risciacqua, ripeti".
 
Dmitry Fedoseev:
Mi ricorda una barzelletta su un programmatore che è scomparso. Era seduto in un bagno freddo, shampoo nelle mani con l'istruzione "insapona, risciacqua e ripeti".
Perché un linguaggio ha bisogno di una tale precisione: che il numero (per esempio) "0,7" sia effettivamente memorizzato come "0,69999..."?
Questo è effettivamente usato da qualche parte? Sono abituato a contare i numeri come in una calcolatrice, si vede con precisione.
Sì, forse la calcolatrice stessa arrotonda qualcosa, e non memorizza i numeri esatti...
Chi ha bisogno di usare cifre così approssimative con frazioni infinite invece di valori esatti?
Dividilo, ottieni 0,7 e non preoccuparti di ritagliare o arrotondare :-)
 
Dmitry Fedoseev:

E se il numero è 0,99999 e dovete lasciare due cifre? Scartare il resto. Dobbiamo ottenere 0,99. Quindi, secondo l'algoritmo suggerito sopra, normalizziamo a tre cifre, otteniamo 1.000, ne scartiamo una e otteniamo 1.00, ma non 0.99.

cerca di ottenere un risultato di0,9999999999999999999

X = 0.99999999999999999

10*X = 10*0.99999999999999999

10*X-X = 10*0.999999999999999-0.9999999999999

9*X = 9*0.99999999999999999

otteniamo 9*X = 9 o X è uguale 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,3333333333 | v2 = 3*(1/3) = 1,00000000

o 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