価格 != 価格 ? - ページ 8

 

このように、いろいろな解決策を試された方のために、私自身がかなり信頼できる解決策として書いたものをご紹介します。

もし、あなたがまだ解決策を探しているのなら、次のようなことに出くわしたということです。

107.123111111 と 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
      }
 

また、単純に2つのdoubleを比較し、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: また、単純に2つのdoubleを比較し、boolの結果を必要とする場合、別の解決策を紹介します。
  1. もし両者が1ポイントでも違えば、trueを返します。これは間違いである。両者は等しくない。

  2. 簡略化

    bool CompareDoubleEqual(double a, double b, int digits)
    {
       return MathAbs(a - b) < MathPow(10, -digits);
    }
    ストップロス後の増額注文 - MQL4プログラミングフォーラム #1.3 2017.05.29