ブログトップ 記事一覧 ログイン 無料ブログ開設

とあるMetaTraderの備忘秘録 RSSフィード Twitter

忙しいです。ネタもないし・・・

2009-07-18

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桁までの正確な値を見ることが出来ます。


興味のある人は見てみてください。