MathMod показывает фокусы. В чем ошибка?

 

Всем  привет, есть довольно простой код, но он возвращает такие чудеса жа страшно.

Суть: Умножаем цену на секунды = и вычисляем вещественный остаток от полученного числа деленное на 2*пункта.  

   double Bidd=Bid;
   double Askk=Ask;
   int sec=Seconds();
   double chetnechet=NormalizeDouble(MathMod(NormalizeDouble((sec*NormalizeDouble(Bidd,Digits)),Digits),Point*2),Digits);

 

 ну по коду ясно что должен возвращать чет или нечет,

так вот иногда возвращает чет иногда нечет, - тоесть остаток от деления двух числе, но иногда возвращает бред, как то:

 

 

          Print(" Bid="+Bidd+" Seconds="+sec+" result="+chetnechet);

 

 

2016.07.19 15:35:38.483 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11453 Seconds=56 result=0.00002
2016.07.19 15:35:22.096 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11452 Seconds=56 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11453 Seconds=55 result=0.00001
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11452 Seconds=54 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11453 Seconds=54 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11452 Seconds=53 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11453 Seconds=52 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11452 Seconds=52 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11453 Seconds=51 result=0.00001
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11452 Seconds=50 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11453 Seconds=50 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11452 Seconds=49 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11454 Seconds=49 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11453 Seconds=48 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11454 Seconds=47 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11453 Seconds=47 result=0.00001
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11454 Seconds=46 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11453 Seconds=45 result=0.00001
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11454 Seconds=45 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11453 Seconds=44 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11454 Seconds=43 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11453 Seconds=43 result=0.00001
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11454 Seconds=42 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11453 Seconds=41 result=0.00001
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11454 Seconds=41 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11453 Seconds=40 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11454 Seconds=40 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11453 Seconds=39 result=0.00001
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11454 Seconds=38 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11453 Seconds=38 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11454 Seconds=37 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11453 Seconds=36 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11455 Seconds=36 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11454 Seconds=35 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11455 Seconds=34 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11454 Seconds=34 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11455 Seconds=33 result=0.00001
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11454 Seconds=32 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11455 Seconds=32 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11454 Seconds=31 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11455 Seconds=30 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11454 Seconds=30 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11455 Seconds=29 result=0.00001
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11454 Seconds=29 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11455 Seconds=28 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11454 Seconds=27 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11455 Seconds=27 result=0.00001
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11454 Seconds=26 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11455 Seconds=25 result=0.00001
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11454 Seconds=25 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11455 Seconds=24 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11454 Seconds=23 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11456 Seconds=23 result=0.00002
2016.07.19 15:35:21.904 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11455 Seconds=22 result=0.00002
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11456 Seconds=21 result=0.00002
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11455 Seconds=21 result=0.00001
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11456 Seconds=20 result=0.00002
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11455 Seconds=20 result=0.00002
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11456 Seconds=19 result=0.00002
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11455 Seconds=18 result=0.00002
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11456 Seconds=18 result=0
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11455 Seconds=17 result=0.00001
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11456 Seconds=16 result=0.00002
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11455 Seconds=16 result=0.00002
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11456 Seconds=15 result=0.00002
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11455 Seconds=14 result=0.00002
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11456 Seconds=14 result=0.00002
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11455 Seconds=13 result=0.00001
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11456 Seconds=12 result=0.00002
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11455 Seconds=12 result=0.00002
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11456 Seconds=11 result=0.00002
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11455 Seconds=10 result=0.00002
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11457 Seconds=10 result=0.00002
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11456 Seconds=9 result=0
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11457 Seconds=9 result=0.00001
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11456 Seconds=8 result=0.00002
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11457 Seconds=7 result=0.00001
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11456 Seconds=7 result=0.00002
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11457 Seconds=6 result=0.00002
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11456 Seconds=5 result=0.00002
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11457 Seconds=5 result=0.00001
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11456 Seconds=4 result=0.00002
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11457 Seconds=3 result=0.00001
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11456 Seconds=3 result=0.00002
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11457 Seconds=2 result=0.00002
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11456 Seconds=1 result=0.00002
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11457 Seconds=1 result=0.00001
2016.07.19 15:35:21.903 2016.02.08 10:22  Exp - maximkashf@yandex.ru 20160719 EURUSD,H1:  Bid=1.11456 Seconds=0 result=0

 

 как видно он иногда возвращает 0.00002 - хотя функция должна возвращать либо 0.00001 либо 0 

 

Тема тут уже обсуждалась (https://www.mql5.com/ru/articles/1561).

Решение: double fmodcor(double a, double b) { int tmpres=int(a/b); return(a-tmpres*b); } 

Особенности работы с числами типа double в MQL4
Особенности работы с числами типа double в MQL4
  • 2009.11.02
  • MetaQuotes Software Corp.
  • www.mql5.com
В данной заметке собраны советы по решению наиболее часто возникающих ошибок при работе с числами типа double в программах на MQL4.
 
Функция MathMod рассчитывает вещественный остаток f от val / y таким образом, что val = i * y + f , где i является целым числом, f имеет тот же знак, что и val, и абсолютное значение f меньше, чем абсолютное значение y.
 
Для определения чёт/нечет вычисления на double не подходят из-за ограниченной точности.

Распечатайте промежуточные значения.

Получив в остатке MathMod 0.00001999999999x(что является правильным значением) и нормализовав число Вы получаете 2*Point


Рекомендую перейти на целочисленную проверку чёт/нечет

 

Спасибо