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

 
Dmitry Fedoseev:
Esto se debe a que es 0,6, por lo que el 0,5 sólo se obtiene haciendo trampas.

double v1 = 1.1234567;

Si se inserta 'v1' en cualquier número, entonces se muestra que se redondea correctamente a 'i = 2'.

 
lilita bogachkova:

Si se inserta 'v1' en cualquier número, se puede ver que hasta 'i = 2' todo se redondea correctamente.

¿Está mal después de i = 2?
 
Ihor Herasko:

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 ocurre con los de tres dígitos, los de cuatro dígitos, etc.

Pero 1,45 se redondea a 2, pero sólo si se ha normalizado previamente con un grado de precisión superior.

void OnStart()
  {
   for(int i=7;i>=0;i--)
     {
      double v1 = 1.4545454;
      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 = 0 = 1.0000000, v2 = 0 = 2.0000000

v1 = 1 = 1.5000000, v2 = 1 = 1.5000000

v1 = 2 = 1,4500000, v2 = 2 = 1,4600000

v1 = 3 = 1.4550000, v2 = 3 = 1.4550000

resulta que si en los cálculos del número se normalizó a una mayor precisión y en los cálculos posteriores para normalizar el número a una menor precisión dará lugar a una diferente de la simplemente normalizado este número a una menor precisión.


 
lilita bogachkova:

resulta que si en el cálculo se normalizó el número con una precisión mayor y en los cálculos posteriores se normaliza el número con una precisión menor, el resultado es diferente al de sólo normalizar el número con una precisión menor.


Por encima de tales acciones se llama "engaño")) Las matemáticas, aunque son una ciencia exacta, deben aplicarse con comprensión. 2 + 3 = 5, pero si 2 cubos más 3 pollos, entonces 5 no funcionará ))
 

Disculpe, pero ¿cómo se obtienen los valores que se desean?

Si utilizo las funciones recomendadas, entonces:

- En un caso obtengo un valor correctamente redondeado
0.06-0.02 =NormalizeDouble(0.03999999999999999,2) = 0.04
La división es aproximada y la normalización es necesaria.

- En el segundo caso, también obtengo el redondeo, pero no es necesario en este caso
0.06-0.024 = NormalizeDouble(0.036,2) = 0.04
La normalización (redondeo) no es necesaria aquí.

Pero, ¿cómo puedo normalizar en lugar de redondear?

 
Roman Starinskij:

Disculpe, pero ¿cómo se obtienen los valores que se desean?

Para ello, basta con formular cuáles son los "valores correctos" ))

Si utilizo las funciones recomendadas, entonces:

- En un caso obtengo un valor correctamente redondeado
0,06-0,02 = NormalizarDoble(0,039999999999999,2) = 0,04
La división es aproximada y no se puede prescindir de la normalización.

- En el segundo caso, también obtengo el redondeo, pero no es necesario en este caso
0,06-0,024 = NormalizarDoble(0,036,2) = 0,04
La normalización (redondeo) no es necesaria en este caso.

Pero, ¿cómo puedo normalizar correctamente, en lugar de redondear los valores?

El ejemplo anterior muestra que está utilizando algún algoritmo intuitivo que determina la "corrección" de la normalización. En el primer caso, es una fracción infinita, mientras que en el segundo es una fracción finita. Ajusta tu algoritmo para convertir el número real a la forma deseada.

Aunque lo más fácil es decidir de antemano la precisión que necesita.

 
Ihor Herasko:

Para ello, basta con formular cuáles son los "valores correctos ))

A partir del ejemplo anterior, se puede ver que se está utilizando algún algoritmo intuitivo, por el cual se determina la "necesidad" de la normalización. En el primer caso, es una fracción infinita, mientras que en el segundo es una fracción finita. Ajuste su algoritmo para convertir el número real a la forma deseada.

Aunque lo más fácil es decidir de antemano qué precisión necesita.


Sólo necesito obtener los mismos números, que solía obtener en la calculadora. :-) Estos son los valores que necesitas.
Así, a "0,06-0,02" se obtiene "0,04" y a "0,06-0,024" se obtiene "0,036".
 
Roman Starinskij:

Sólo necesito obtener los mismos números que estoy acostumbrado a obtener en una calculadora. :-) Estos son los valores que necesitas.
Si quieres "0,06-0,02" obtendrás "0,04" y si quieres "0,06-0,024" obtendrás "0,036".
Si quieres obtener 0,036 (3 decimales), tienes que normalizar a 3 decimales, no a 2.
 
Dmitry Fedoseev:
Si quiere 0,036 (3 decimales), normalice a 3, no a 2.

Me equivoqué, hasta 3 dígitos deben ser normalizados. ¿Es posible hacerlo?

 
Roman Starinskij:

Me equivoqué, hasta 3 dígitos deben ser normalizados. ¿Funcionará así?

Aquí está su código:

0.06-0.024 = NormalizeDouble(0.036,2) = 0.04

En lugar de 2, pon 3 y será 0,036.

Razón de la queja: