Арифметическое округление числа

 

В MQL функция NormalizeDouble так же как и round возвращают число, просто отбрасывая конечные дробные символы.

Почему бы одну из них не сделать для арифметического округления числа. Или добавить флаг арифметическое округление/отсечение дробной части.

 

Не отбрасывают они, а округляют.

Смысл round в том, что параметр только 1.

 

Вот фрагмент кода

         datetime web_time = get_web_time();
         time_shift = int(NormalizeDouble((web_time-TimeCurrent())/100, 0)*100);
         Print("new time synchronization. web time: ",TimeToString(web_time,TIME_SECONDS)," tick time: ",TimeToString(TimeCurrent(),TIME_SECONDS)," shift: ",string(time_shift));

Вот результат

CG      0       12:20:52.884    ARM Scalper v1.0 (EURUSD,M1)    new time synchronization. web time: 09:20:49 tick time: 11:20:49 shift: -7200
QE      0       12:21:02.957    ARM Scalper v1.0 (EURUSD,M1)    2
IM      0       12:21:51.991    ARM Scalper v1.0 (EURUSD,M1)    new time synchronization. web time: 09:21:48 tick time: 11:21:49 shift: -7200
KS      0       12:22:03.096    ARM Scalper v1.0 (EURUSD,M1)    2
GK      0       12:22:52.130    ARM Scalper v1.0 (EURUSD,M1)    new time synchronization. web time: 09:22:48 tick time: 11:22:48 shift: -7200
II      0       12:23:03.055    ARM Scalper v1.0 (EURUSD,M1)    2
NQ      0       12:24:40.140    ARM Scalper v1.0 (EURUSD,M1)    new time synchronization. web time: 09:24:39 tick time: 11:24:37 shift: -7100
FG      0       12:24:40.140    ARM Scalper v1.0 (EURUSD,M1)    2
MO      0       12:25:00.379    ARM Scalper v1.0 (EURUSD,M1)    new time synchronization. web time: 09:24:56 tick time: 11:24:57 shift: -7200
KM      0       12:25:03.190    ARM Scalper v1.0 (EURUSD,M1)    2

Такой же результат и с функцией round

         datetime web_time = get_web_time();
         time_shift = int(round((web_time-TimeCurrent())/100)*100);
         Print("new time synchronization. web time: ",TimeToString(web_time,TIME_SECONDS)," tick time: ",TimeToString(TimeCurrent(),TIME_SECONDS)," shift: ",string(time_shift));

Арифметического округления не происходит.

Вот так нагляднее

GH      0       13:08:51.502    ARM Scalper v1.0 (EURUSD,M1)    new time synchronization. web time: 10:08:48 tick time: 12:08:48 shift: -7200
EI      0       13:09:03.054    ARM Scalper v1.0 (EURUSD,M1)    2
DF      0       13:09:51.560    ARM Scalper v1.0 (EURUSD,M1)    new time synchronization. web time: 10:09:48 tick time: 12:09:48 shift: -7200
IG      0       13:10:02.905    ARM Scalper v1.0 (EURUSD,M1)    2
KL      0       13:10:52.746    ARM Scalper v1.0 (EURUSD,M1)    new time synchronization. web time: 1646215850 tick time: 1646223049 shift: -7100
DM      0       13:11:03.470    ARM Scalper v1.0 (EURUSD,M1)    2
OJ      0       13:11:53.255    ARM Scalper v1.0 (EURUSD,M1)    new time synchronization. web time: 1646215910 tick time: 1646223110 shift: -7200
RD      0       13:12:02.968    ARM Scalper v1.0 (EURUSD,M1)    2
 
Andrey Kaunov #:

Вот фрагмент кода

Вот результат

Такой же результат и с функцией round

Арифметического округления не происходит.

происходит целочисленное деление :-)

в 

(web_time-TimeCurrent())/100

поставьте 100.0 или преобразуйте в double и жизнь наладиться 

 
Maxim Kuznetsov #:

происходит целочисленное деление :-)

в 

поставьте 100.0 или преобразуйте в double и жизнь наладиться 

Тьфу, точно. Вот заклинит бывает...

 
Andrey Kaunov #:

Вот фрагмент кода

Вот результат

Такой же результат и с функцией round

Арифметического округления не происходит.


По порядку:

1. Переменная web_time типа datatime. Это целочисленный тип.

2. TimeCurrent() тоже возвращает datatime, т.е. целое.

3. Соответственно, тип результата операции  web_time-TimeCurrent() - целый.

4. В результате деления целого на целое получается целое число, при этом округления не происходит (дробная часть просто отбрасывается).

5. Потом идёт умножение на 100 и преобразование datatime в int.


PS. Меня опередили, но оставлю комментарий для новичков.

 
Да всё верно, многие наверное сталкиваются.