Ошибки с дробными числами

 

При написании советника для работы с лотами от 0.01 до 0.99 столкнулся с проблемой присваивания переменным дробных чисел. Вместо того чтобы присвоить переменной значение 0.15 ей присваивается иногда значение совершенно другое, которое по алгоритму работы советника просто быть не может. Ошибки в самом советнике нет. Хотелось бы получить толковый совет как решить эту проблему. Ну и для примера еще кусочек кода

double Lot, Lot1, Lot2;

if(Lot1==Lot2)

{Lot=Lot1;}

Значения Lot1 и Lot2 вычисляются по разным алгоритмам и принимают значение от 0.01 до 0.99, при их равенстве значению Lot должно присваиваться значение Lot1, но это происходит не всегда. При работе с целыми числами такой проблемы нет, присвоение происходит нормально. При тестировании именно этого кусочка значения выводились на экран, так что я видел когда должно было произойти присвоение, а когда нет.

 
Camnoce6e:

При написании советника для работы с лотами от 0.01 до 0.99 столкнулся с проблемой присваивания переменным дробных чисел. Вместо того чтобы присвоить переменной значение 0.15 ей присваивается иногда значение совершенно другое, которое по алгоритму работы советника просто быть не может. Ошибки в самом советнике нет. Хотелось бы получить толковый совет как решить эту проблему. Ну и для примера еще кусочек кода

double Lot, Lot1, Lot2;

if(Lot1==Lot2)

{Lot=Lot1;}

Значения Lot1 и Lot2 вычисляются по разным алгоритмам и принимают значение от 0.01 до 0.99, при их равенстве значению Lot должно присваиваться значение Lot1, но это происходит не всегда. При работе с целыми числами такой проблемы нет, присвоение происходит нормально. При тестировании именно этого кусочка значения выводились на экран, так что я видел когда должно было произойти присвоение, а когда нет.

Может начать награждать званиями типа "лентяй" или соской авторов подобных постов ? А то, похоже, остальные усилия успеха не имеют: опять по сотне раз одно и то же.....
 
VladislavVG:
Может начать награждать званиями типа "лентяй" или соской авторов подобных постов ? А то, похоже, остальные усилия успеха не имеют: опять по сотне раз одно и то же.....
Это жизнь. Мудрый Рош, когда мы затеяли ФАК сказал что-то типа: "Дурная работа, бог в помощь! Кто не читает справку, тот и ФАК читать не будет"
 

Да я лентяй, поэтому изучаю язык MQL4 и пишу советник, мне лень самому выставлять ордера и анализировать рынок. А вот из за таких постов становится проблематично найти необходимую инфу.

ЛЕНЬ - ДВИГАТЕЛЬ ПРОГРЕССА

 
Camnoce6e:

Да я лентяй, поэтому изучаю язык MQL4 и пишу советник, мне лень самому выставлять ордера и анализировать рынок. А вот из за таких постов становится проблематично найти необходимую инфу.

ЛЕНЬ - ДВИГАТЕЛЬ ПРОГРЕССА


В данном случае - это тормоз
 
Camnoce6e:

Да я лентяй, поэтому изучаю язык MQL4 и пишу советник, мне лень самому выставлять ордера и анализировать рынок. А вот из за таких постов становится проблематично найти необходимую инфу.

ЛЕНЬ - ДВИГАТЕЛЬ ПРОГРЕССА

А почему не

if(NormalizeDouble(lot1,2)==NormalizeDouble(lot2,2)) ??

или интересней:

double lt1, lt2;

lt1=NormalizeDouble(lot1,2);

lt2=NormalizeDouble(lot2,2);

if(lt1==lt2)

{

}

 
Camnoce6e:

Да я лентяй, поэтому изучаю язык MQL4 и пишу советник, мне лень самому выставлять ордера и анализировать рынок. А вот из за таких постов становится проблематично найти необходимую инфу.

ЛЕНЬ - ДВИГАТЕЛЬ ПРОГРЕССА

Если б Вы ее (необходимую информацию) пробовали искать, то разговор был бы совсем другой. И вопросы Ваши сформулированы были б по-другому. Тогда и такой бы реакции не последовало.
 
Всем огромное спасибо. Просто я начинаю учить язык MQL4 и не знаю многих тонкостей его работы и уж никак не думал что работа с числами с плавющей запятой будет проблемой. Хотя такая же проблема существует и у языка С++ на базе которого написан этот.
 
Ничто не даётся так дёшево и не ценится так дорого как вежливость.
 
В свое время отказался от сравнивания таких чисел в пользу сравнения их разницы с пороговым значением, что аналогично приему с нормализацией.
Причина обращения: