Размер позиции, возвращающий отрицательное значение - страница 3

 
JD4:

Вышеизложенное было конкретным ответом на ваше конкретное сообщение"MathRound возвращает двойное число; бесконечное количество десятичных знаков. "

Еще раз, согласно странице документации.

"Возвращаемое значение

Значение, округленное до ближайшего целого числа."

Теперь конкретный ответ на эту часть вашего сообщения.

"Что написано на странице, то и делается. Он округляет. Ничего общего с вопросом о нескольких десятичных знаках."

Опять же, перечитайте цитату, там сказано, что возвращается "Значение, округленное до ближайшего целого числа". Целое число, по определению, это целое число, т.е. без десятичных знаков. И опять же, если это не то, что это на самом деле делает, то код или описание нарушены, и одно или другое или оба должны быть исправлены MQ, или иначе предупреждающая надпись, говорящая, что эти функции не работают так, как рекламируется.

Если он действительно возвращает заданный тип, но в математическом эквиваленте к ближайшему целому числу (например, возвращает 1.00000 от 1.23456, и 1 == 1.00000), но не возвращает фактический тип целого числа, то на странице ссылки нужно указать что-то вроде "не изменяет базовый тип данных" или другой способ, который четко указан. Я думаю, что это был плоский перевод с оригинальной русской страницы, и поэтому он не так ясен на английском, как должен быть.

Документация MetaQuotes в лучшем случае слаба.

Однако, несмотря на это, MathRound() возвращает двойное число по определению:

Если бы возвращаемое значение гласило: "Значение делится на 2", оно все равно было бы двойным.

Точно так же, как "Значение, округленное до ближайшего целого числа", все равно будет двойкой.

Надеюсь, это поможет

 
honest_knave:

Документация MetaQuotes в лучшем случае слаба.

Однако, несмотря на это, MathRound() возвращает двойное число по определению:

Если бы возвращаемое значение читалось как: "Значение делится на 2", оно все равно было бы двойным.

Точно так же, как "Значение, округленное до ближайшего целого числа", все равно будет двойкой.

Надеюсь, это поможет

Для меня "Value rounded till the nearest integer" не ясно, что он возвращает что-либо кроме целого числа из-за определения целого числа. Я понимаю, что это на самом деле так работает, но это подчеркивает мою точку зрения, что код и/или официальная формулировка страницы сломаны и должны быть исправлены. Либо код должен быть исправлен так, чтобы он возвращал тип int, либо формулировка страницы должна быть изменена. У нас, как у пользователей, нет возможности сделать это.Значение, которое вы получаете от округляемого числа, не меняется, если только вы не присваиваете его обратно этой переменной. Например, если вы округляете y со значением 1.3 и помещаете его в x, используя формулировку выше, после завершения функции вы ожидаете, что y по-прежнему будет содержать 1.3, а x будет содержать 1, а не 1.0. В моем понимании, и как я это читаю, округление означает, что вы округляете до ближайшего элемента, до которого вы пытаетесь округлить, а не до значения, эквивалентного этому элементу. Возможно, фраза "что-то потерялось при переводе" здесь очень уместна.
 
JD4:
Для меня "Value rounded till the nearest integer" не ясно, что он возвращает что-то кроме целого числа из-за определения integer. Я понимаю, что на самом деле это так и работает, но это подчеркивает мою точку зрения, что код и/или официальная формулировка страницы не работают и должны быть исправлены. Либо код должен быть скорректирован так, чтобы он действительно возвращал тип int, либо формулировка страницы должна быть изменена. У нас, как у пользователей, нет возможности сделать это.Значение, которое вы получаете от округляемого числа, не меняется, если только вы не присваиваете его обратно этой переменной. Например, если вы округляете y со значением 1.3 и помещаете его в x, используя формулировку выше, после завершения функции вы ожидаете, что y по-прежнему будет содержать 1.3, а x будет содержать 1, а не 1.0. В моем понимании, и как я это читаю, округление означает, что вы округляете до ближайшего элемента, до которого вы пытаетесь округлить, а не до значения, эквивалентного этому элементу. Возможно, фраза "что-то потерялось при переводе" здесь очень уместна.

Я не поклонник документации, но должен сказать, что, на мой взгляд, они были последовательны в этом отношении. Во всей документации тип возвращаемых данных (int, double, bool и т.д.) указан в верхней части страницы, а в разделе возвращаемых значений никогда не повторяется этот тип данных. К тому же в данном случае возвращается точно такой же тип данных, который был введен.

В любом случае, если вы используете директиву компилятора #property strict, вы должны получить предупреждение:

 
honest_knave:

Я не поклонник документации, но должен сказать, что, на мой взгляд, они были последовательны в этом отношении. Во всей документации тип возвращаемых данных (int, double, bool и т.д.) указан в верхней части страницы, а в разделе возвращаемых значений никогда не повторяется этот тип данных. К тому же в данном случае возвращается точно такой же тип данных, который был введен.

В любом случае, если вы используете директиву компилятора #property strict, вы должны получить предупреждение:


Я начал тему на форуме MQL5.com https://www.mql5.com /en/forum/61394, которая, надеюсь, в конечном итоге поможет решить проблему с документацией. Возможно, если мы соберем достаточно людей, MQ позволит нам всем помочь исправить то, что до сих пор было проблемой для многих. Я надеюсь, что MQ примет эту идею, потому что мы как пользователи не можем ничего изменить.

@ knave & WH - Я полностью согласен с вашими примерами, но я все еще вижу здесь проблему, которую я либо не объясняю ясно, либо я один из немногих людей, которые видят в этом проблему. Мне кажется, что ваши примеры доказывают мою сторону в этой теме больше, чем вы думаете, что они доказывают вашу сторону.

knave, ваш пример вернет ошибку, потому что он возвращает не тот тип данных, который должен возвращать - int. Тот факт, что вы приводите свою переменную как int, только облегчает понимание проблемы с неправильной работой функции.

WH, вы указываете на эту строку (со страницы документа), и она говорит в основном то же самое, что и строка, которую я выделяю. Пример использует только двойку в качестве значения, которое отправляется в функцию. Ни одно из ваших сообщений не показывает, что на 100% определенно ясно, что тип данных, возвращаемых из функции, является двойкой, только то, что пример отправляет двойку.

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

В данном случае все обстоит иначе. На странице указано "округлить до ближайшего целого числа указанного числового значения". Это означает, что функция будет округлять до меньшей точности (int) от другого значения. В используемом примере передается double. Это все, что ясно на 100%.

 

Извините, JD4, вы меня совсем запутали...

JD4:

Ни в одном из ваших постов не видно, что на 100% однозначно утверждается, что тип данных, возвращаемый из функции - double, только то, что пример посылает double.

Именно это я и отметил стрелкой. Она возвращает двойку (большая красная стрелка), и переданный параметр также является двойкой (под моей стрелкой). Взгляните на любую функцию. OrderSend() возвращает int... OrderClose() возвращает bool...., а MathRound() возвращает double.

JD4:

knave, ваш пример вернет ошибку, потому что он не возвращает тип данных, который должен возвращать - int. Тот факт, что вы приводите свою переменную как int, только облегчает понимание проблемы с неправильной работой функции.

Функция работает именно так, как заявлено.

Если вы думаете, что это int (неправильно), вы получите следующее:

Если вы переводите его как int, вы признаете, что используете неправильный тип данных:

Если вы рассматриваете его как double (чем он и является), у вас нет предупреждений:

 
honest_knave:

Простите, JD4, вы меня совсем запутали...

Это именно то, что я отметил стрелкой. Она возвращает двойку (большая красная стрелка), и переданный параметр также является двойкой (под моей стрелкой). Посмотрите на любую функцию. OrderSend() возвращает int... OrderClose() возвращает bool...., а MathRound() возвращает double.

Функция работает именно так, как заявлено.

Если вы думаете, что это int (неправильно), вы получите это:


Если вы переведете его как int, вы поймете, что используете неправильный тип данных:


Если вы рассматриваете его как double (а это так и есть), то никаких предупреждений нет:

В вашем примере кода int RoundedNumber вы приводите тип, чтобы вернуть int в качестве возвращаемого типа. Это не должно быть необходимо, так как он должен возвращать int, основываясь на том, что говорит вам страница. В строке вверху и в возвращаемом значении говорится, что он округляет до целого числа указанного значения.Целое число, сколько бы раз мы не повторяли, не имеет десятичных знаков, дробей или любого другого способа представления чисел между целыми числами, нулем и отрицательными целыми числами. В примере, который я разместил выше, исходя из приведенных документов, отправка функции MathRound "1.3" должна вернуть "1", а не "1.0", так как "1.0" не является целым числом, а "1" является. (Кавычки только для пояснения)

Типизация как int показывает ошибку, потому что базовая функция работает не так, как указано на странице, а не потому, что она должна возвращать не int. Если вы рассматриваете ее как double (чем она может быть, но не должна быть), то это просто позволяет некорректной функции продолжать работать не так, как она задокументирована - возвращать целое число, которое было округлено от переданного ей значения, которое является double.

Отправка двойки для округления (так, как код документирован сейчас) в целое число, а затем приведение или сохранение возвращаемого значения к типу double не приведет к ошибкам, потому что предполагается, что возвращается int, и если вы сохраняете int в double, вы не теряете точность при преобразовании.Если вы сохраняете double в int, вы будете ожидать ошибку, подобную той, которую вы показываете, потому что вы заставляете его преобразовываться в другую форму с меньшей точностью, чем у него была до этого.

Если функция MathRound не должна возвращать int, то формулировка на странице должна быть изменена так, чтобы не было сказано, что она должна возвращать int. Моя проблема никогда не была в том, что функция делает что-то отличное от того, что она делает, кроме того, что это противоречит тому, что написано на странице, что она должна делать.Им нужно либо исправить код функции так, чтобы она возвращала int, как сказано на странице документации, либо отредактировать страницу документации, чтобы отразить, что она не обязательно возвращает int. "Округляется до ближайшего целого числа" - это именно оно, целое число.

Edit: Я провел дальнейшее исследование как через ссылки на C++, так и на Java, поскольку MQL в некоторой степени основан на C++ и синтаксически похож на Java и C++. C++ показывает в одной части документа(http://www.cplusplus.com/reference/cmath/round/)"Round to nearest Returns the integral value that is nearest to x, with halfway cases rounded away from zero." But later on the page it says"Return Value The value of x rounded to the nearest integral (as a floating-point value)."Вы можете сказать, что это подтверждает вашу точку зрения, хотя на самом деле это не так, потому что в C++ указано, что возвращается float. Документация по Java на http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html показывает следующее о двух методах с именем round. Оба (Java и C++) функционально эквивалентны в своих языках функциям MathRound и/или round в MQL.

static long round(double a)
Возвращает ближайший long к аргументу, с округлением в большую сторону.
статический int round(float a)
Возвращает ближайшее к аргументу значение int с округлением в большую сторону.
 

MQL MathRound возвращает целочисленное значение в типе данных float. Конечно, то, что делают функции округления в C++ или Java, не имеет значения. Тривиально написать свою собственную функцию 'int round(double a)' в MQL, если вам это нужно.

(32-битные) плавающие числа могут содержать (16-битные) целые числа без потери точности. Проблема в том, что ОП хочет округлить значение до двух знаков после запятой и ожидает, что оно будет точным. Этого не произойдет.

 
ydrol:

MQL MathRound возвращает целочисленное значение в типе данных float. Конечно, то, что делают функции округления в C++ или Java, не имеет значения. Тривиально написать свою собственную функцию 'int round(double a)' в MQL, если вам это нужно.

(32-битные) плавающие числа могут содержать (16-битные) целые числа без потери точности. Проблема в том, что ОП хочет округлить значение до двух знаков после запятой и ожидает, что оно будет точным. Этого не произойдет.

Я отклонился от темы, поскольку мои сообщения были конкретно о том, что функция работает определенным образом, и я закончил публиковать это обсуждение вне темы. Если это обсуждение функции закончится перемещением в другое место, я не против.

Edit: Я начал тему для продолжения обсуждения этой противоречивой страницы документа на https://www.mql5.com/en/forum/156174. Gum, я ответил на ваше сообщение ниже в этой теме.
 

JD4, похоже, вы единственный человек, которого это смущает.

HonestKnave указал, что документация ясно показывает, что функция возвращает двойное число. Целое число представлено в виде двойки.

"Округление до ближайшего целого числа" не означает, что оно преобразуется в целое число.

Если я скажу вам отрезать кусок дерева такой же длины, как кусок струны. Дерево все еще остается деревом, оно не превращается в кусок струны.

 
JD4:

В строке сверху и в возвращаемом значении говорится, что функция округляет до целого числа указанного значения.

JD4:

Нужно либо исправить код функции так, чтобы она возвращала int, как сказано на странице документации, либо отредактировать страницу документации, чтобы отразить, что она не обязательно возвращает int. "Округляется до ближайшего целого числа" - это именно оно, целое число.


Ну, я не уверен, что убедит вас JD4. В документации четко, на 100% указано, что функция возвращает двойку. Вы читаете что-то другое в описании возвращаемого значения - там никогда не говорится, что она возвращает целое число.

Если вы посмотрите на OrderSend(), там написано "Возвращаемое значение: Возвращает номер тикета, присвоенного ордеру торговым сервером, или -1 в случае неудачи. Для получения дополнительной информации об ошибках необходимо вызвать функцию GetLastError()".

Так что же подразумевается под номером? Это довольно расплывчато, не находите? Имеется ли в виду double? float? char? short? int? long? Ответ находится в верхней части страницы, как та большая стрелка, которую я разместил ранее. Это их стандартный формат для того, чтобы увидеть возвращаемый тип данных. (заметьте, я не сказал "возвращаемое значение данных"). Я действительно не могу вспомнить ни одного примера в документации, где в разделе "возвращаемое значение" упоминался бы тип данных.

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