MQLでの小数の取り扱いについて(NormalizeDoubleの働き)

MQLで小数を扱う場合、NormalizeDoubleによる正規化をしないと、正しく判定されない場合があるので注意が必要です。

例えば0.01を10回足す下記のようなコードを書きます。

double val=0.0;
for(int i=0; i<10; i++){
   val+=0.01;
}

Print(val);

結果は「0.1」となるはずですが、
以下のような値が出力されます。

>>0.09999999999999999

これは0.1と等しい値として取り扱われるでしょうか?
確かめてみましょう。

if(val==0.1){
      Print("the same");
}
else{
      Print("not the same");
}

結果は、

>>not the same

同じ値ではないと判定されてしまいます。

そこでNormalizeDoubleで正規化してみましょう。

val=NormalizeDouble(var1,5);

Print(val);

if(val==0.1){
      Print("the same");
}
else{
      Print("not the same");
}

結果は、

>>0.1
>>the same

同じ値として判定されました!

上記の例のように、NormalizeDoubleによる正規化をしないと、正しく判定されない場合があるので注意が必要です。

コメント

タイトルとURLをコピーしました