MQL4のdouble型の比較に注意する話
過去の日記より転載。
今日はMQL4初心者がハマる罠の1つ、"double型の比較"について紹介します。
変数 a には 1.2693 (EUR/USD)という価格が入っていて、
変数 b には、とある魔術の計算式から 1.2693 という値が入っている場合。
もし a==b なら何か処理をする.. という場合に、
if(a == b) { 何かの処理;}
と書いてしまうと、aもbも1.2693 なのに、処理が行われない???? という現象が起きることがあります。
ウソだと思う人は、
double a=1.2693;
double b=1269299999.9999998/1000000000;
if(a==b){Alert("OK ! ");}else{ Alert(a+" "+b);}
というコードを実行してみてください。
この例では、aとbは一致しないので、後段のAlertが実行されるのですが、そこで表示されるa,bは完全に一致しています。
こうして、、、Printデバッグでaとbが一致してるのに、なんで OK!がでないんや?@@;;;;
とハマる訳です。
こういう現象を避ける為の正しい書き方は、
if(NormalizeDouble(a-b,8)==0) Alert("OK ! ");
です。
MetaQuotes社は初心者に優しく、とても親切なので、stdlib.mq4 のなかに、
double型の比較用関数 CompareDoubles や、
double型の真の値を表示させる為の DoubleToStrMorePrecision を用意しています。16桁までの正確な値を見ることが出来ます。
興味のある人は見てみてください。