Внимание! Особенности вычислений языка MQL

 

Уважаемые разработчики торговых систем!

Хочу обратить ваше внимание на особенность при арифметических операциях с переменными типа int. Ценность этого сообщения в том, что если вы разделите переменную с типом int на число, при делении на которое получается нецелое число, то вы получите целое округлённое число!

С такой проблемой обычно сталкиваются люди, ранее программирующие на каких-либо других языках, при расчёте коэффициента процента риска для своих советников.

Чтобы облегчить понимание этого замечания, я написал следующий скрипт (он же прикреплён):

int start() {
int    intPercent=30;
double dblPercent=30;
double AnyPrice=1.2556;
double res;
string str="При вычислениях раздробления целого числа получаются следующие результаты вычислений...\n";
res=AnyPrice*(1+intPercent/100);
str=StringConcatenate(str,"...если использовать тип процента integer:\t",res,"\n");
res=AnyPrice*(1+dblPercent/100);
str=StringConcatenate(str,"...если использовать тип процента double: \t",res,"\n");
MessageBox(str,"Расчёт 130% от цены: "+AnyPrice,MB_OK|MB_ICONWARNING);
return(0);
}

Здесь рассчитывается значение цены, увеличенное на 30%. Обратите внимание, что в левой части равенств стоит переменная типа double в обоих случаях! Но результаты оказываются разными:


Результаты вычислений

p.s: Я программировал на Visual Basic'e. Там в обоих бы случаях получилось 1.6323

Файлы:
 
EvgeTrofi >>:

 если вы разделите переменную с типом int на число, при делении на которое получается нецелое число, то вы получите целое округлённое число!

это не округление а обрезание дробных остатков

округление выполняет MathRound

 
Вам сюда. А еще посмотрите здесь.
 

Спасибо!