Баг MQL4 или я что-то не понимаю?

 

Предельно упростив проблему, которая возникла при написании реального советника, пришел к такому примеру:

double a=1.3502-1.3500;

if (a==0.0002)
Alert("да");
else if (a>0.0002)
Alert ("a>0.0002");
else if (a<0.0002)
Alert ("a<0.0002");

Как вы считаете, что должен вернуть этот фрагмент кода? По моей логике, "да" .

На практике он возвращает "a<0.0002"!!!!

Почему????

 
ZETH:

Предельно упростив проблему, которая возникла при написании реального советника, пришел к такому примеру:

double a=1.3502-1.3500;

if (a==0.0002)
Alert("да");
else if (a>0.0002)
Alert ("a>0.0002");
else if (a<0.0002)
Alert ("a<0.0002");

Как вы считаете, что должен вернуть этот фрагмент кода? По моей логике, "да" .

Расставь пожалуйста фигурные скобки. Понимаю, что они не нужны и можно их опустить (что ты и сделал). Но выполни мою просьбу - покажи пожалуйста тот же самый код, но в котором фигурные скобки стоят после каждого if и после каждого else (как оно и положено)
 
drknn:
Расставь пожалуйста фигурные скобки. Понимаю, что они не нужны и можно их опустить (что ты и сделал). Но выполни мою просьбу - покажи пожалуйста тот же самый код, но в котором фигурные скобки стоят после каждого if и после каждого else (как оно и положено)

Проделал ваш совет, расставил фигурные скобки..даже принтовка ничем не помогла :(

   double a = 1.3502-1.3500;

   if(a==0.0002)
   {
      Print("YEAH  = ", a);
   }
   else
   {  
      if(a>0.0002)
      {
         Print("a>0.0002  = ", a);
      }
      else
      {
         if(a<0.0002)
         Print("a<0.0002  = ", a);
      }
   }

вот картинка получившегося, снова меньше 0.0002.... Действительно странный глюк.

 
ZETH:

Предельно упростив проблему, которая возникла при написании реального советника, пришел к такому примеру:

double a=1.3502-1.3500;

if (a==0.0002)
Alert("да");
else if (a>0.0002)
Alert ("a>0.0002");
else if (a<0.0002)
Alert ("a<0.0002");

Как вы считаете, что должен вернуть этот фрагмент кода? По моей логике, "да" .

На практике он возвращает "a<0.0002"!!!!

Почему???



Почитайте про нормализацию и зачем она нужна.

 

ZETH:

Почему????

Потому что:

   double a,b;
      
   a = 1.35000000000000002;
   b = 1.3500000000000002;

   if(a==b)
      Print("U-u-u-u-ups.....ps...ps...ps...");
   else
      Print("YEAH");
   
   a = 1.350000000000000002;
   b = 1.35000000000000002;

   if(a==b)
      Print("U-u-u-u-ups.....ps...ps...ps...");
   else
      Print("YEAH");


Гы.....

 
double

NormalizeDouble

значение double сохраняет только 4 значения после запятой, в нашем случае a = 1.35000000000000002; сократится до 1.35 и на условие if(a==b), журнал принтанет "U-u-u-u-ups.....ps...ps...ps..."

а NormalizeDouble а необходима для того чтобы отчистить лишние значения после запятой до Digits знаков. Помню писал советника и после подсчета цены открытия, она выдавала цену =1.36932313236789. нормалтзация приводило цену в вид 1.3693 и все нормально открывалось. Вроде так, да ?

 
LLIAMAH:

значение double сохраняет только 4 значения после запятой, в нашем случае a = 1.35000000000000002; сократится до 1.35 и на условие if(a==b), журнал принтанет "U-u-u-u-ups.....ps...ps...ps..."

а NormalizeDouble а необходима для того чтобы отчистить лишние значения после запятой до Digits знаков. Помню писал советника и после подсчета цены открытия, она выдавала цену =1.36932313236789. нормалтзация приводило цену в вид 1.3693 и все нормально открывалось. Вроде так, да ?


Не так. Почему Вы решили что только 4 знака
 
LLIAMAH:

значение double сохраняет только 4 значения после запятой, в нашем случае a = 1.35000000000000002; сократится до 1.35 и на условие if(a==b), журнал принтанет "U-u-u-u-ups.....ps...ps...ps..."

а NormalizeDouble а необходима для того чтобы отчистить лишние значения после запятой до Digits знаков. Помню писал советника и после подсчета цены открытия, она выдавала цену =1.36932313236789. нормалтзация приводило цену в вид 1.3693 и все нормально открывалось. Вроде так, да ?

Образование у Вас какое ? Хотя бы базовые курсы информатики и программирования значатся в списке изученных предметов ? Это не попытка приколоться - просто если нет, то Вам нужно начинать с еще более начальных уровней, а не кидаться сразу программировать. Это не очень сложно, но экономит массу времени при написании программ.