Предельно упростив проблему, которая возникла при написании реального советника, пришел к такому примеру:
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 (как оно и положено)
Проделал ваш совет, расставил фигурные скобки..даже принтовка ничем не помогла :(
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.... Действительно странный глюк.
Предельно упростив проблему, которая возникла при написании реального советника, пришел к такому примеру:
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 и все нормально открывалось. Вроде так, да ?
значение 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 знака
значение double сохраняет только 4 значения после запятой, в нашем случае a = 1.35000000000000002; сократится до 1.35 и на условие if(a==b), журнал принтанет "U-u-u-u-ups.....ps...ps...ps..."
а NormalizeDouble а необходима для того чтобы отчистить лишние значения после запятой до Digits знаков. Помню писал советника и после подсчета цены открытия, она выдавала цену =1.36932313236789. нормалтзация приводило цену в вид 1.3693 и все нормально открывалось. Вроде так, да ?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Предельно упростив проблему, которая возникла при написании реального советника, пришел к такому примеру:
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"!!!!
Почему????