Fiyat != Fiyat ? - sayfa 8

 

Tüm çemberleri atlayanlar ve tüm çözümleri deneyenler için işte kendim için oldukça güvenilir bir çözüm olarak yazdıklarım.

Hâlâ çözüm arayışı içindeyseniz bu, şöyle bir şeyle karşılaştığınız anlamına gelir:

107.123111111 ve 107.123999 sonuçlarının karşılaştırılması, çift yuvarlama varyansının bir sonucu olarak 10712 3 ile 10712 4 karşılaştırılmaktadır.

Karşılaştırmadan çift yuvarlama varyansını kaldırmak için +1 ve -1 aralığını dikkate almayan bu sorun için benim çözümüm.


Bunu dene:

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

Ve işte, sadece iki dubleyi karşılaştırıyor ve bir bool sonucu gerektiriyorsa, başka bir çözüm:

 // 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 : Ve eğer sadece iki dubleyi karşılaştırıyor ve bir bool sonucu gerektiriyorsa, işte başka bir çözüm:
  1. Bir noktada farklılık gösterirlerse, true değerini döndürürsünüz. Hangisi yanlış - eşit değiller.

  2. basitleştirin

     bool CompareDoubleEqual( double a, double b, int digits)
    {
       return MathAbs (a - b) < MathPow ( 10 , -digits) ;
    }
    Durdurma kaybından sonra Siparişi Artırın - MQL4 programlama forumu #1.3 2017.05.29