Can price != price ? - page 8

 

Pour ceux qui ont sauté à travers tous les cerceaux et essayé toutes les solutions, voici ce que j'ai écrit comme une solution assez fiable pour moi-même.

Si vous êtes toujours à la recherche d'une solution, cela signifie que vous êtes tombé sur quelque chose comme ceci :

en comparant 107.123111111 et 107.123999, 107.123 est comparé à 107124 en raison de la variance du double arrondi.

Voici ma solution pour ce problème qui ne tient pas compte de la plage de +1 et -1 pour supprimer la variance du double arrondi de la comparaison.


Essayez ceci :

      // 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
      }
 

Et voici une autre solution si vous comparez simplement deux doubles et que vous avez besoin d'un résultat 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: Et voici une autre solution si on compare simplement deux doubles et qu'on a besoin d'un résultat bool :
  1. S'ils diffèrent d'un point, vous retournez true. Ce qui est faux - ils ne sont pas égaux.

  2. Simplifiez

    bool CompareDoubleEqual(double a, double b, int digits)
    {
       return MathAbs(a - b) < MathPow(10, -digits);
    }
    Augmenter l'ordre après le stoploss - MQL4 programming forum #1.3 2017.05.29