Può il prezzo != prezzo ? - pagina 8

 

Per coloro che hanno saltato tutti i cerchi e provato tutte le soluzioni ecco quello che ho scritto come una soluzione abbastanza affidabile per me stesso.

Se siete ancora alla ricerca della soluzione significa che vi siete imbattuti in qualcosa di simile a questo:

coparing 107.123111111 e 107.123999 risulta che 107.123 viene confrontato con 107124 come risultato di una doppia varianza di arrotondamento.

Ecco la mia soluzione per questo problema che ignora l'intervallo di +1 e -1 per rimuovere la varianza del doppio arrotondamento dal confronto.


Provate questo:

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

Ed ecco un'altra soluzione se si confrontano semplicemente due doppi e si richiede un risultato 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: Ed ecco un'altra soluzione se si confrontano semplicemente due doppi e si richiede un risultato bool:
  1. Se differiscono di un punto, si restituisce true. Il che è sbagliato - non sono uguali.

  2. Semplificare

    bool CompareDoubleEqual(double a, double b, int digits)
    {
       return MathAbs(a - b) < MathPow(10, -digits);
    }
    Aumentare l'ordine dopo lo stoploss - MQL4 programming forum #1.3 2017.05.29
Motivazione: