Может ли цена != цена ? - страница 8

 

Для тех, кто прошел через все обручи и перепробовал все решения, вот что я написал как вполне надежное решение для себя.

Если вы все еще ищете решение, значит, вы столкнулись с чем-то подобным:

Сравнение 107.12311111111 и 107.123999 приводит к тому, что 107.123 сравнивается с 107124 в результате дисперсии двойного округления.

Вот мое решение для этой проблемы, которое не учитывает диапазон +1 и -1, чтобы убрать дисперсию двойного округления из сравнения.


Попробуйте это:

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

А вот еще одно решение, если нужно просто сравнить две двойки и получить результат 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: А вот еще одно решение, если нужно просто сравнить две двойки и получить результат в виде bool:
  1. Если они отличаются на точку, вы возвращаете true. Это неверно - они не равны.

  2. Упростите

    bool CompareDoubleEqual(double a, double b, int digits)
    {
       return MathAbs(a - b) < MathPow(10, -digits);
    }
    Увеличение ордера после стоплосса - Форум по программированию MQL4 #1.3 2017.05.29