O preço da lata != preço ? - página 8

 

Para aqueles que saltaram por todos os obstáculos e tentaram todas as soluções aqui está o que escrevi como uma solução bastante confiável para mim mesmo.

Se você ainda está em busca de solução, isto significa que se deparou com algo assim:

A coparing 107.123111111 e 107.123999 faz com que 107.123 seja comparado com 107124 como resultado de uma dupla variação de arredondamento.

Aqui está minha solução para este problema que desconsidera a variação de +1 e -1 para remover a dupla variação de arredondamento da comparação.


Tente isto:

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

E aqui está outra solução se simplesmente comparar duas duplas e requerer um resultado de 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: E aqui está outra solução se simplesmente comparar duas duplas e requerer um resultado de bool:
  1. Se eles diferem por um ponto, você retorna verdadeiro. O que é errado - eles não são iguais.

  2. Simplifique

    bool CompareDoubleEqual(double a, double b, int digits)
    {
       return MathAbs(a - b) < MathPow(10, -digits);
    }
    Aumentar pedido após perda - Fórum de programação MQL4 #1.3 2017.05.29