DoubleとFLOATの比較 - MathFloorの不明確なエラー - ページ 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));

スプレッド:2

2017.02.26 09:56:54.475 2017.01.02 00:03:00 Exp - DOUBLE TESTMATHFLOOR EURUSD,M30:DOUBLE askP2=105143 bidP2=105141 Averab2=105142.000000 AUTOPRICE=1.0514200000

2017.02.26 09:56:54.475 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30:FLOAT askP=105143 bidP=105141 Averab=105142.00000000 AUTOPRICE=1.0514199734




スプレッド:3

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

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


スプレッド:4

2017.02.26 09:58:05.813 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30:DOUBLE askP2=105145 bidP2=105141 Averab2=105143.000000 AUTOPRICE=1.0514200000

2017.02.26 09:58:05.813 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30:FLOAT askP=105145 bidP=105141 Averab=105143.00000000 AUTOPRICE=1.0514299870

スプレッド:5

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

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


 
は、問題をより具体的に説明するために、トピック名を変更しました。
 
Vladislav Andruschenko:

2017.02.26 09:58:05.813 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30:DOUBLE askP2=105145 bidP2=105141 Averab2=105143.000000 AUTOPRICE=1.0514200000

結果は正解です。Averab2 < 105143。

 
fxsaber:

結果は正解です。Averab2 < 105143。

なぜかというと、Averab2=105143.00000000 だからです。

 
Vladislav Andruschenko:

Averab2=105143.00000000の 理由は?

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

DoubleとFLOATの比較 - MathFloorの不明確なエラー

fxsaber さん 2017.02.26 08:27

二重番号のプリントアウトは、何の意味もありません。doubleの真の値を表示したい場合は、そのバイトを見る必要があります。

 
Vladislav Andruschenko:

なぜかというと、Averab2=105143.00000000 だからです。

というのも、https://www.mql5.com/ru/docs/math/mathfloor
 
fxsaber:

言いたいことはわかります。ありがとうございます。しかし、これは下塗りをしていない状態での話です。

しかし、コード内の実値は、アンプライム後と同じです。 何度も確認しました。

了解しました。

は、ダブル1=1.00000000000000001123515であることを意味します。

といった具合に。

:-( OK、肝心の問題はfloatで解決。

 
Andrey F. Zelinsky:
というのも、https://www.mql5.com/ru/docs/math/mathfloor

105143

MathFloor(105143) =105142の

105143.000000000000001でも

が、何を言っているのかわかる気がする。

までも

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

2 MathFloor=2



なぜMathFloor(105143) =105142 なのか、理解できない...。(105143ではなく105142.9999999999 であれば別ですが)。

 
Vladislav Andruschenko:

然れば

というのも、https://www.mql5.com/ru/docs/convert/normalizedouble
 
Vladislav Andruschenko:

なぜ、MathFloor(105143) =105142 なのか、理解できませんが......。(105143ではなく105142.999999999999 でなければ)。

#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));
}
結果
Price1 = 105143.0 MathFloor(Price1) = 105143.0 Price2 = 105143.0 MathFloor(Price2) = 105142.0 Price1>Price2 = true

ダブルナンバーを文字通りに受け取らない方がいい。フロートへの切り替えは、さらに落とし穴です。