¿Puede el precio != el precio ? - página 8

 

Para los que pasaron por todos los aros y probaron todas las soluciones aquí está lo que escribí como una solución bastante fiable para mí.

Si todavía estás en la búsqueda de la solución esto significa que te encontraste con algo como esto:

copar 107.123111111 y 107.123999 da como resultado que 107.123 se compare con 107124 como resultado de la doble varianza de redondeo.

Aquí está mi solución para este problema que ignora el rango de +1 y -1 para eliminar la varianza de doble redondeo de la comparación.


Pruebe esto:

      // double compare by leoa451
        int CompDoubleE0L1M2(double DoubleA, double DoubleB, int PointsToCompare)
      {
         int IntForDoubleA = (int)(MathFloor(MathPow(10,PointsToCompare) * DoubleA));
         int IntForDoubleB = (int)(MathFloor(MathPow(10,PointsToCompare) * DoubleB));
         
         if(IntForDoubleA >= IntForDoubleB-1 && IntForDoubleA <= IntForDoubleB+1) { return 0; }         // if doubleA within +1/-1 range of doubleB (to compensate for the double rounding veriance)
         else if(IntForDoubleA < IntForDoubleB) { return 1; }                                           // if doubleA < doubleB
         else if(IntForDoubleA > IntForDoubleB) { return 2; }                                           // if doubleA > doubleB
         else return -2;                                                                                // error
      }
 

Y aquí hay otra solución si simplemente se comparan dos dobles y se requiere un resultado bool:

// return true if same double value within digits comparison
bool CompareDoubleEqual(double a, double b, int digits)
{
   if (MathAbs(a - b) > MathPow(10, -digits))
      return(false);

   return(true);
}
 
Dretta: Y aquí hay otra solución si simplemente se comparan dos dobles y se requiere un resultado bool:
  1. Si difieren en un punto, se devuelve true. Lo cual es erróneo: no son iguales.

  2. Simplifique

    bool CompareDoubleEqual(double a, double b, int digits)
    {
       return MathAbs(a - b) < MathPow(10, -digits);
    }
    Aumentar la orden después de stoploss - MQL4 foro de programación #1.3 2017.05.29