Arrotondamento dei numeri in MT4 tramite NormalizeDouble - pagina 3

 

Matematica. Grado 6. Libro di testo. Nikolsky S.M., Potapov M.K. Mosca: 2012. - 256 с

Arrotondamento.

Arrotondamento

 

Che argomento acceso è diventato questo. MT4 sembra funzionare correttamente con l'arrotondamento.
Intendevo cheNormalizeDouble(0.055,2) non arrotonda il numero"0.055" a "0.06", ma lo rifila a "0.05".

Ho problemi a capire queste funzioni MKL. Non capisco davvero perché i prezzi "1.0015223567" dovrebbero essere arrotondati usando la funzione NormalizeDouble, se tutto ciò che si vuole è portare il numero DIRETTO alla cifra giusta.
Cioè, per NormalizeDouble(1.001526789, 5) risulterebbe "1.00152". Non ha bisogno di
essere arrotondatoa "1,00153". Ci deve essere la funzione RoundDouble per questo =)

È possibile? O è necessario arrotondare sempre e ottenere numeri sbagliati?

 

È meglio che ti decida già. È l'arrotondamento:

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Arrotondamento dei numeri in MT4 tramite NormalizeDouble

Roman Starinskij, 2016.01.21 10:03

Salve. Potete dirmi qual è il problema.

Perché la funzione NormalizeDouble(0.055,2) arrotonda il numero "0.055" a "0.06"?

Non è una funzione di arrotondamento delle frazioni.


Non lo fa:

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Arrotondamento dei numeri in MT4 tramite NormalizeDouble

Roman Starinskij, 2016.01.25 14:30

Che argomento acceso è diventato questo. MT4 sembra funzionare correttamente con l'arrotondamento.
IntendevoNormalizeDouble(0.055,2) non per arrotondare il numero"0.055" a "0.06", ma per tagliarlo a "0.05".

Ho problemi a capire queste funzioni MKL. Non capisco davvero perché "1.0015223567" dovrebbe essere arrotondato con la funzione NormalizeDouble, se tutto ciò che si vuole è portare il numero BORROWN al posto giusto.
Cioè, per NormalizeDouble(1.001526789, 5) risulterebbe "1.00152". Non ha bisogno di
essere arrotondatoa "1,00153". Ci deve essere la funzione RoundDouble per questo =)

È possibile? O è necessario arrotondare sempre e ottenere numeri che non si vogliono?


E per il gusto di sperimentare:

//+------------------------------------------------------------------+
//|                                              NormalizeDouble.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property script_show_inputs
#property description "Проверка NormalizeDouble"
input double   value=0.055;      // нормализуемое число 
input int      digits=2;         // кол-во знаков после запятой 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Print("Число ",value," округлённое с точностью до ",digits," знаков = ",NormalizeDouble(value,digits));
  }
//+------------------------------------------------------------------+
File:
Test.mq5  2 kb
 
Roman Starinskij:

Che argomento acceso è diventato questo. MT4 sembra funzionare correttamente con l'arrotondamento.
Intendevo cheNormalizeDouble(0.055,2) non arrotonda il numero"0.055" a "0.06", ma lo rifila a "0.05".

Ho problemi a capire queste funzioni MKL. Non capisco davvero perché i prezzi "1.0015223567" dovrebbero essere arrotondati usando la funzione NormalizeDouble, se tutto ciò che si vuole è portare il numero DIRETTO alla cifra giusta.
Cioè, per NormalizeDouble(1.001526789, 5) risulterebbe "1.00152". Non ha bisogno di
essere arrotondatoa "1,00153". Ci deve essere la funzione RoundDouble per questo =)

È possibile? O avete bisogno di arrotondare sempre e ottenere numeri che non volete?

Se hai bisogno di tagliare, allora taglia; se hai bisogno di arrotondare, allora arrotonda. La funzione NormalkizeDouble() arrotonda e questo è quello che vi serve più spesso.

Perché pensi che RoundDouble() dovrebbe essere usato al posto di NormalizeDouble()? Hai creato tu questo mondo? Va bene che una palla stia rotolando e che un quadrato abbia quattro angoli?

 
Roman Starinskij:

Che argomento acceso è diventato questo.


Tutto questo perché chi inizia il topic non legge la documentazione della lingua e non ascolta ciò che gli viene detto
 
Slawa:
Questo perché l'autore non legge la documentazione linguistica e non ascolta ciò che gli viene detto.

Il seguente comportamento di divisione e arrotondamento delle frazioni è un po' poco chiaro.

Ci sono 2 equazioni:
0.06-0.02 = 0.03999999999999999
0.06-0.024 = 0.036

Usando la funzione raccomandata NormalizeDouble, otteniamo questi risultati:
0.03999999999999999 = 0.04
0.036 = 0.04

Nel primo esempio abbiamo davvero bisogno di ottenere il valore 0,04, ma nel secondo abbiamo bisogno di 0,03 (è così che funziona una normale calcolatrice).
NormalizeDouble dovrebbe essere usato perché vengono restituite frazioni che non sono complete, ma nel secondo caso, la funzione restituisce valori errati, e non si può non usarla nemmeno per il primo esempio.

 
Roman Starinskij:

Il seguente comportamento di divisione e arrotondamento delle frazioni è un po' poco chiaro.

Ci sono due equazioni:
0.06-0.02 = 0.03999999999999999
0.06-0.024 = 0.036

Usando la funzione raccomandata NormalizeDouble, otteniamo questi risultati:
0.03999999999999999 = 0.04
0.036 = 0.04

Nel primo esempio abbiamo davvero bisogno di ottenere il valore 0,04, ma nel secondo abbiamo bisogno di 0,03 (è così che funziona una normale calcolatrice).
NormalizeDouble dovrebbe essere usato perché vengono restituite frazioni che non sono complete, ma nel secondo caso, la funzione restituisce valori errati, e non si può non usarla nemmeno per il primo esempio.

La vostra calcolatrice normale non calcola correttamente, dovrebbe:

 
Slawa:
Tutto perché il topicstarter non legge la documentazione della lingua e non ascolta ciò che gli viene detto

se N+1 cifra < 5, allora la Nesima cifra viene mantenuta e N+1 e tutte le cifre successive vengono azzerate;

se N+1 cifra ≥ 5, l'ennesima cifra viene incrementata di uno e N+1 e tutte le cifre successive vengono azzerate;

Scusate, ma continuo a non capire perché l'arrotondamento per '2' non permette immediatamente = 0,06000000

void OnStart()
  {

   double v1 = NormalizeDouble(0.055,3);
   double v2 = NormalizeDouble(0.0549,3);

   v1=NormalizeDouble(v1,2);
   v2=NormalizeDouble(v2,2);
   Print("v1 = ",DoubleToString(v1),", v2 = ",DoubleToString(v2));

  }

v1 = 0,06000000, v2 = 0,06000000

void OnStart()
  {

   double v1 = NormalizeDouble(0.055,2);
   double v2 = NormalizeDouble(0.0549,2);

   Print("v1 = ",DoubleToString(v1),", v2 = ",DoubleToString(v2));

  }

v1 = 0,06000000, v2 = 0,05000000

void OnStart()
  {
   for(int i=7;i>=1;i--)
     {
      double v1 = 1.1234567;
      double v2 = NormalizeDouble(v1,i+1);

      v1=NormalizeDouble(v1,i);
      v2=NormalizeDouble(v2,i);
      Print("v1 = ",i," = ",DoubleToString(v1,7),", v2 = ",i," = ",DoubleToString(v2,7));
     }
     Print("---");
  }

---

v1 = 1 = 1.1000000, v2 = 1 = 1.1000000
v1 = 2 = 1.1200000, v2 = 2 = 1.1200000
v1 = 3 = 1,1230000, v2 = 3 = 1,1240000
v1 = 4 = 1.1235000, v2 = 4 = 1.1235000
v1 = 5 = 1.1234600, v2 = 5 = 1.1234600
v1 = 6 = 1.1234570, v2 = 6 = 1.1234570
v1 = 7 = 1.1234567, v2 = 7 = 1.1234567




 
lilita bogachkova:


Mi dispiace, ma continuo a non capire perché l'arrotondamento per '2' non permette di ottenere = 0,06000000


Perché è 0,6, quindi 0,5 può essere ottenuto solo barando.
 
lilita bogachkova:

Mi dispiace, ma ancora non capisco perché l'arrotondamento per '2' rende impossibile ottenere = 0,06000000


Quando una sola cifra è normalizzata, è semplice: 0, 1, 2, 3, 4 -> 0, e 5, 6, 7, 8, 9 -> 1.

Quando si normalizzano due cifre, vengono presi in considerazione i numeri a due cifre: 0 - 49 -> 0, e 50 - 99 -> 1. Dopo tutto, se il numero 1,49 deve essere arrotondato a numeri interi, dobbiamo davvero ottenere 2, che è 51 centesimi contro i 49 centesimi disponibili per 1?

Lo stesso vale per le tre cifre, le quattro cifre, ecc.