Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Разбираетесь в своей области? Поделитесь этим с миллионами трейдеров!
ZZZ275
59
ZZZ275 2011.11.11 20:15 

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

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"!!!!

Почему????

o_O
Модератор
23259
o_O 2011.11.11 20:20  
Владимир Тезис
4268
Владимир Тезис 2011.11.12 01:23  
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 (как оно и положено)
LLIAMAH
34
LLIAMAH 2011.11.12 13:30  
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.... Действительно странный глюк.

PapaYozh
3768
PapaYozh 2011.11.12 18:38  
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"!!!!

Почему???



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

Владимир
1402
Владимир 2011.11.12 20:21  

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");


Гы.....

LLIAMAH
34
LLIAMAH 2011.11.13 05:05  
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 и все нормально открывалось. Вроде так, да ?

Victor Nikolaev
Модератор
14028
Victor Nikolaev 2011.11.13 05:54  
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 знака
Vladyslav Goshkov
1957
Vladyslav Goshkov 2011.11.13 12:02  
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 и все нормально открывалось. Вроде так, да ?

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