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

 

Las matemáticas. Grado 6. Libro de texto. Nikolsky S.M., Potapov M.K. Moscú: 2012. - 256 с

Redondeo.

Redondeo

 

Qué tema tan candente ha resultado ser este. MT4 parece funcionar correctamente con el redondeo.
Me refería a queNormalizeDouble(0,055,2) no redondeara el número"0,055" a "0,06", sino que lo recortara a "0,05".

Tengo problemas para entender estas funciones de MKL. Realmente no entiendo por qué "1.0015223567" debe ser redondeado usando NormalizeDouble, si todo lo que se quiere es llevar el número BORROWN al lugar correcto.
Es decir, NormalizarDoble(1,001526789, 5) daría como resultado "1,00152". No
es necesario redondeara "1,00153". Debe existir la función RoundDouble para eso =)

¿Es posible? ¿O es necesario redondear todo el tiempo y obtener números erróneos?

 

Será mejor que te decidas ya. Es el redondeo:

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Redondear números en MT4 mediante NormalizeDouble

Roman Starinskij, 2016.01.21 10:03

Hola. ¿Puede decirme cuál es el problema?

¿Por qué la función NormalizeDouble(0.055,2) redondea el número "0.055" a "0.06"?

No es una función de redondeo de fracciones.


No es así:

Foro sobre comercio, sistemas de comercio automatizados y prueba de estrategias de comercio

Redondear números en MT4 mediante NormalizeDouble

Roman Starinskij, 2016.01.25 14:30

Qué tema tan candente ha resultado ser este. MT4 parece funcionar correctamente con el redondeo.
Me refería aNormalizeDouble(0,055,2) no para redondear el número"0,055" a "0,06", sino para recortarlo a "0,05".

Tengo problemas para entender estas funciones de MKL. No entiendo muy bien por qué hay que redondear "1,0015223567" con la función NormalizeDouble, si lo único que quieres es llevar el número DIRECTO al lugar correcto.
Es decir, NormalizarDoble(1,001526789, 5) daría como resultado "1,00152". No
es necesario redondeara "1,00153". Debe existir la función RoundDouble para eso =)

¿Es posible? ¿O es necesario redondear todo el tiempo y obtener números que no quieres?


Y en aras de la experimentación:

//+------------------------------------------------------------------+
//|                                              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));
  }
//+------------------------------------------------------------------+
Archivos adjuntos:
Test.mq5  2 kb
 
Roman Starinskij:

Qué tema tan candente ha resultado ser este. MT4 parece funcionar correctamente con el redondeo.
Me refería a queNormalizeDouble(0,055,2) no redondeara el número"0,055" a "0,06", sino que lo recortara a "0,05".

Tengo problemas para entender estas funciones de MKL. No entiendo muy bien por qué hay que redondear "1,0015223567" con la función NormalizeDouble, si lo único que se quiere es llevar el número de BORRO al lugar correcto.
Es decir, NormalizarDoble(1,001526789, 5) daría como resultado "1,00152". No
es necesario redondeara "1,00153". Debe existir la función RoundDouble para eso =)

¿Es posible? ¿O necesitas redondearlo todo el tiempo y obtener números que no quieres?

Si hay que recortar, se recorta; si hay que redondear, se redondea. La función NormalkizeDouble() redondea y esto es lo que más se necesita.

¿Por qué crees que debería utilizarse RoundDouble() en lugar de NormalizeDouble()? ¿Has creado este mundo? ¿Está bien que una pelota ruede y un cuadrado tenga cuatro esquinas?

 
Roman Starinskij:

Qué tema tan candente ha resultado ser este.


Todo se debe a que el que inicia el tema no lee la documentación del idioma y no escucha lo que se le dice
 
Slawa:
Esto se debe a que el autor no lee la documentación lingüística y no escucha lo que le dicen.

El siguiente comportamiento de dividir y redondear fracciones es un poco confuso.

Hay 2 ecuaciones:
0.06-0.02 = 0.03999999999999999
0.06-0.024 = 0.036

Utilizando la función recomendada NormalizeDouble, obtenemos estos resultados:
0.03999999999999999 = 0.04
0.036 = 0.04

En el primer ejemplo necesitamos realmente obtener el valor 0,04, pero en el segundo necesitamos 0,03 (así es como funciona una calculadora normal).
NormalizeDouble debería usarse porque se devuelven fracciones que no están completas, pero en el segundo caso, la función devuelve valores incorrectos, y tampoco puedes no usarla para el primer ejemplo.

 
Roman Starinskij:

El siguiente comportamiento de dividir y redondear fracciones es un poco confuso.

Hay dos ecuaciones:
0.06-0.02 = 0.03999999999999999
0.06-0.024 = 0.036

Utilizando la función recomendada NormalizeDouble, obtenemos estos resultados:
0.03999999999999999 = 0.04
0.036 = 0.04

En el primer ejemplo necesitamos realmente obtener el valor 0,04, pero en el segundo necesitamos 0,03 (así es como funciona una calculadora normal).
NormalizeDouble debería usarse porque se devuelven fracciones que no están completas, pero en el segundo caso, la función devuelve valores incorrectos, y tampoco puedes no usarla para el primer ejemplo.

Su calculadora normal no calcula correctamente, debería hacerlo:

 
Slawa:
Todo porque el tópico no lee la documentación del idioma y no escucha lo que se le dice

si el dígito N+1 < 5, entonces el dígito N se mantiene y N+1 y todos los dígitos posteriores se ponen a cero;

si N+1 dígito ≥ 5, el Nº dígito se incrementa en uno y N+1 y todos los dígitos posteriores se ponen a cero;

Lo siento, pero sigo sin entender por qué el redondeo por '2' no permite inmediatamente = 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:


Lo siento, pero sigo sin entender por qué el redondeo por '2' no permite obtener = 0,06000000


Porque es 0,6, así que el 0,5 sólo se puede obtener haciendo trampas.
 
lilita bogachkova:

Lo siento, pero sigo sin entender por qué el redondeo por '2' hace imposible obtener = 0,06000000


Cuando sólo se normaliza un dígito, es sencillo: 0, 1, 2, 3, 4 -> 0, y 5, 6, 7, 8, 9 -> 1.

Cuando se normalizan dos dígitos, se tienen en cuenta los números de dos cifras: 0 - 49 -> 0, y 50 - 99 -> 1. Al fin y al cabo, si hay que redondear el número 1,49 a enteros, ¿realmente hay que obtener 2, que es 51 centésimas frente a las 49 centésimas disponibles de distancia a 1?

Lo mismo con los de tres dígitos, los de cuatro dígitos, etc.