Double vs FLOAT - anlaşılmaz MathFloor hatası - sayfa 2

 
       float AUTOPRICE;
       float askP= NormalizeDouble ( Ask , Digits )/ NormalizeDouble ( Point , Digits );
       float bidP= NormalizeDouble ( Bid , Digits )/ NormalizeDouble ( Point , Digits );
       float Averab=((askP+bidP))/ 2.0 ;
      AUTOPRICE= MathFloor (Averab)* Point ;
       Print ( "FLOAT  " + "  askP=" +askP+ " bidP=" +bidP+ " Averab=" + DoubleToString (Averab, 10 )+ " AUTOPRICE=" + DoubleToString (AUTOPRICE, 10 ));

       double AUTOPRICE2;
       double askP2= NormalizeDouble ( Ask , Digits )/ NormalizeDouble ( Point , Digits );
       double bidP2= NormalizeDouble ( Bid , Digits )/ NormalizeDouble ( Point , Digits );
       double Averab2=((askP2+bidP2))/ 2.0 ;
      AUTOPRICE2= MathFloor (Averab2)* Point ;
       Print ( "DOUBLE  " + "  askP2=" +askP2+ " bidP2=" +bidP2+ " Averab2=" + DoubleToString (Averab2, 10 )+ " AUTOPRICE=" + DoubleToString (AUTOPRICE2, 10 ));

yayılma:2

2017.02.26 09:56:54.475 2017.01.02 00:03:00 Exp - ÇİFT TEST MATHFLOOR EURUSD,M30: DOUBLE askP2=105143 bidP2=105141 Averab2=105142.0000000000 AUTOPPRICE= 1.0514200000

2017.02.26 09:56:54.475 2017.01.02 00:03:00 Exp - ÇİFT TEST MATHFLOOR EURUSD,M30: FLOAT askP=105143 bidP=105141 Averab=105142.0000000000 AUTOPPRICE= 1.0514199734




yayılma:3

2017.02.26 09:57:47.832 2017.01.02 00:03:00 Exp - ÇİFT TEST MATHFLOOR EURUSD,M30: DOUBLE askP2=105144 bidP2=105141 Averab2=105142.5000000000 AUTOPPRICE= 1.0514200000

2017.02.26 09:57:47.832 2017.01.02 00:03:00 Exp - ÇİFT TEST MATHFLOOR EURUSD,M30: FLOAT askP=105144 bidP=105141 Averab=105142.5000000000 AUTOPPRICE= 1.0514199734


yayılma:4

2017.02.26 09:58:05.813 2017.01.02 00:03:00 Exp - ÇİFT TEST MATHFLOOR EURUSD,M30: DOUBLE askP2=105145 bidP2=105141 Averab2=105143.0000000000 AUTOPPRICE= 1.0514200000

2017.02.26 09:58:05.813 2017.01.02 00:03:00 Exp - ÇİFT TEST MATHFLOOR EURUSD,M30: FLOAT askP=105145 bidP=105141 Averab=105143.0000000000 AUTOPPRICE= 1.0514299870

yayılma:5

2017.02.26 09:58:39.495 2017.01.02 00:03:00 Exp - ÇİFT TEST MATHFLOOR EURUSD,M30: DOUBLE askP2=105146 bidP2=105141 Averab2=105143.5000000000 AUTOPPRICE= 1.0514300000

2017.02.26 09:58:39.495 2017.01.02 00:03:00 Exp - ÇİFT TEST MATHFLOOR EURUSD,M30: FLOAT askP=105146 bidP=105141 Averab=105143.5000000000 AUTOPPRICE= 1.0514299870


 
sorunu belirtmek için konuyu yeniden adlandırdı.
 
Vladislav Andruschenko :

2017.02.26 09:58:05.813 2017.01.02 00:03:00 Exp - ÇİFT TEST MATHFLOOR EURUSD,M30: DOUBLE askP2=105145 bidP2=105141 Averab2=105143.0000000000 AUTOPPRICE= 1.0514200000

Sonuç doğru. Ortalama2 < 105143.

 
fxsaber :

Sonuç doğru. Ortalama2 < 105143.

niye ya? çünkü Averab2= 105143.000000000

 
Vladislav Andruschenko :

niye ya? çünkü Averab2= 105143.000000000

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Double vs FLOAT - anlaşılmaz MathFloor hatası

fxsaber , 2017.02.26 08:27

Çift sayı yazdırmak hiçbir şey ifade etmez. Gerçek çift değeri yazdırmak istiyorsanız, baytlarına bakmanız gerekir.

 
Vladislav Andruschenko :

niye ya? çünkü Averab2= 105143.000000000

çünkü https://www.mql5.com/ru/docs/math/mathfloor
 
fxsaber :

Seni anladım. Teşekkürler, ama bu çıktıyla ilgili.

ancak kodun içindeki gerçek anlam çıktıdan sonraki ile aynıdır. birçok kez kontrol ettim

Anladım,

bu çift 1 = 1.000000000000000000000000000112123515;

vb.

:-( tamam, asıl mesele problemin float ile çözülmesidir.

 
Andrey F. Zelinsky :
çünkü https://www.mql5.com/ru/docs/math/mathfloor

105143

MathFloor( 105143 ) = 105142'den sonra

105143.00000000000000000000001 olsa bile

Ama sanırım neden bahsettiğini anlıyorum.

olmasa da

Print ( 2 +" MathFloor ="+ MathFloor ( 2 ));

2 MathFloor = 2



neden MathFloor( 105143 ) = 105142 Anlayamıyorum ... ( 105143 yoksa, ancak 105142.999999999999999999999999 )

 
Vladislav Andruschenko :

neden o zaman...

çünkü https://www.mql5.com/ru/docs/convert/normalizedouble
 
Vladislav Andruschenko :

neden MathFloor( 105143 ) = 105142 Anlayamıyorum ... ( 105143 yoksa, ancak 105142.999999999999999999999999 )

#define TOSTRING(A) #A + " = " + ( string )(A) + " "

void OnStart ()
{
   double Price1 = 105143 ;
   double Price2 = Price1 - 1 e- 11 ;

   Print (TOSTRING(Price1) + TOSTRING( MathFloor (Price1)) +
        TOSTRING(Price2) + TOSTRING( MathFloor (Price2)) +
        TOSTRING(Price1 > Price2));
}
Sonuç
Price1 = 105143.0 MathFloor (Price1) = 105143.0 Price2 = 105143.0 MathFloor (Price2) = 105142.0 Price1>Price2 = true

Çift sayıların çıktısını tam anlamıyla almayın. Yüzmeye geçmek daha da fazla tuzaktır.

Neden: