а вот казалось бы, операция деления, - но каков результат!

 

Полдня, полдня искал ошибку в программе, а оказалось...


Отчаялся, пишу в программе "Print( DoubleToStr( 50 / 45, 8));", ответ оказывается 1.000..., а не 1.1111... как я думал.

Оказывается, если делятся целочисленные, то результат то же целочисленный, даже если переменная куда нужно записать результат double.


И что теперь делать? есть какой нибудь способ заставить его делить правильно?

 

50.0 / 45.0

 

Не, так не пойдет. У меня в программе две целочисленные переменные. Я в них считаю штучки, по этому логично, что переменные целочисленные. Но потом мне нужно одни штучки поделить на другие, что бы найти проценты. Которые, понятно, будут не целочисленные.


В си можно использовать приведение типов, написал что то типа double ( 5 / 3) и результат будет double.

 

В Си++ double(5 / 3) = 1.0

А C-style cast выглядит по-другому.

(double)res

 

Напишите так:

Print(1.0*Первая_Штучка/Вторая_Штучка);
 

Сложно найти человека который в свое время не наступил на эти грабли) А вообще морока конечно, приведешь к дабл для того же деления, забудешь, засада со сравнением.... Как на войне, глаз да глаз)

А вообще мне кажется, что когда разрабатывался язык MQL, самая сложная на нем программа представлялась на уровне того же MACD_Sample, и подобными ньюансами особо не заморачивались. А теперь выясняется, что "язык неплохо бы подтянуть" до уровня того же СИ, с отладчиками, структурами и тд, для соответствия к предявляемым к нему требованиям. Но создание подобной среды само по себе мегазадача, а разработчикам МТ "предлагается" ее решить в качестве сопутствующей продукта при создании новой версии терминала...)

 

Мелочь, а приятно

int a = 5;
int b = (double)3; // Все Ок
double c = (double)a/b; // Все Типа Ок
Print(c); // Будет Единица !! :-)

if((double)( a / b) > 1) { // Ошибка компиляции!
  Print("Ok");
}

if( (double)a / b > 1) { // Ошибка компиляции!
  Print("Ok");
}


 
KimIV >>:

Напишите так:

О! а я вот так сделал, но то же работает 50 /( 45 + 0.0).

 
jartmailru >>:

В Си++ double(5 / 3) = 1.0

А C-style cast выглядит по-другому.

(double)res

не суть, главное наличие явного приведения типов.

 
Figar0 >>:

Сложно найти человека который в свое время не наступил на эти грабли) А вообще морока конечно, приведешь к дабл для того же деления, забудешь, засада со сравнением.... Как на войне, глаз да глаз)

А вообще мне кажется, что когда разрабатывался язык MQL, самая сложная на нем программа представлялась на уровне того же MACD_Sample, и подобными ньюансами особо не заморачивались. А теперь выясняется, что "язык неплохо бы подтянуть" до уровня того же СИ, с отладчиками, структурами и тд, для соответствия к предявляемым к нему требованиям. Но создание подобной среды само по себе мегазадача, а разработчикам МТ "предлагается" ее решить в качестве сопутствующей продукта при создании новой версии терминала...)

Да это всё понятно. Обидно время терять на такие мелочи. Они ведь не описаны в доке.

 
HideYourRichess >>:

О! а я вот так сделал, но то же работает ( 50 / 45 + 0.0).

Проверил.

Print("check! =  ", (50 / 45 + 0.0));

ожидаемо дает единицу.

.

Вероятно, имелось в виду

Print("pum! ", ( 50 / (45 + 0.0) )  );

Причина обращения: