Чего я не вижу, а оно есть - ошибка в коде(MQL4), но где?

 

Привет, коллеги.

Помогите, глаза уже сломал, не знаю где искать.

Бала задача: получить статистку по закрытым сделкам.

Организовал int Stat[4] и туда кладу результаты запроса выборки по истории сделок. Все ок.

После,решил получить процентное выражение, например, сколько процентов содержит прибыльные сделки во всех по валютному инструменту - получаю 0. 

Откуда нули при делении Stat[1]/Stat[0], если элементы массива не нулевые (3/7*100>0)? 

Код:

  int Stat[4]; 

  Stat[0]=0; //  всего закрытых сделок 
  Stat[1]=0; // сделки в + 
  Stat[2]=0; Stat[3]=0; 
  // передать по ссылке. получить результат 
  GetStat(Stat); 
  // проверяем  
  if (Stat[0]>0) Print("Stat[0]=",Stat[0]," Stat[1]=",Stat[1]," Stat[1]/Stat[0]=",Stat[1]/Stat[0]*100);

 

А журнале чудеса:

016.03.28 13:55:29.404  2016.03.24 06:35 EA_GAP v.1.00 EURUSD,M1: Stat[0]=7 Stat[1]=3 Stat[1]/Stat[0]=0
2016.03.28 13:55:28.604 2016.03.24 06:34 EA_GAP v.1.00 EURUSD,M1: Stat[0]=7 Stat[1]=3 Stat[1]/Stat[0]=0
2016.03.28 13:55:27.868 2016.03.24 06:33 EA_GAP v.1.00 EURUSD,M1: Stat[0]=7 Stat[1]=3 Stat[1]/Stat[0]=0
2016.03.28 13:55:27.100 2016.03.24 06:32 EA_GAP v.1.00 EURUSD,M1: Stat[0]=7 Stat[1]=3 Stat[1]/Stat[0]=0
2016.03.28 13:55:26.620 2016.03.24 06:31 EA_GAP v.1.00 EURUSD,M1: Stat[0]=7 Stat[1]=3 Stat[1]/Stat[0]=0
2016.03.28 13:55:26.524 2016.03.24 06:30 EA_GAP v.1.00 EURUSD,M1: Stat[0]=7 Stat[1]=3 Stat[1]/Stat[0]=0
 

int/int будет целое число (то есть в результате не будет дробного числа с запятой)!

Проверка:

   int a=3;
   int b=7;
   Print("3/7=",3/7,"; 3*1.0/7*1.0=",3*1.0/7*1.0);

и результат:

3/7=0; 3*1.0/7*1.0=0.4285714285714285
 
Karputov Vladimir:

int/int будет целое число (то есть в результате не будет дробного числа с запятой)!

Это такая фишка в mql4? Офигеть. И кто такое придумал?

В любом случае, спасибо, за ваш, труд. 

 
fromme2you:

Это такая фишка в mql4? Офигеть. И кто такое придумал?

В любом случае, спасибо, за ваш, труд. 

Какой тип переменной которой вы присваиваете результат деления? Если тип int то при делении идет неявное преобразование типа.

По идее деление int на int должно всегда давать результат double. Это видимо, что то функция Print() чудит.  

 
Не нужно надеяться на неявное преобразование, если нет понимания в разнице между различными целочисленными типами и типами с плавающей точкой. Всегда лучше явно задавать преобразование.
 

Глянул как это работает в C#. Там тоже деление int на int дает результат int, если не указать оператор явного преобразования типов.

double x; int y; int z;

x = y/z; округляет результат до ближайшего целого  

x = (double) y/z; округление нет считает  как и должно быть.

 
Vitalii Ananev:

Какой тип переменной которой вы присваиваете результат деления? Если тип int то при делении идет неявное преобразование типа.

По идее деление int на int должно всегда давать результат double. Это видимо, что то функция Print() чудит.  

Все разрешилось преобразованием типов. А я то думал, что компилятор сам в стеке объявит double, а нет - нужно преобразовывать. 
Причина обращения: