Я также только что попробовал использовать это безрезультатно. Возможно, DTS просто изменяет точность значения для внешнего вида, а не фактическое значение? Я не вижу других вариантов.
Да, я думаю, что строка просто делает значение в double версией для печати, но не изменяет его. Не уверен, как это сделать в MQL, но я знаю, что в Java можно принудительно преобразовать тип из одного типа в другой (в данном случае double в int).
// Casting conversion (5.4) of a float literal to// type int. Without the cast operator, this would// be a compile-time error, because this is a// narrowing conversion (5.1.3):int i = (int)12.5 f;
// String conversion (5.4) of i's int value:
System.out.println("(int)12.5f==" + i);
В вашем случае, я полагаю, вы могли бы сделать так, чтобы здесь было написано что-то вроде
int intConvertedDouble = (int) valueYouGotItFrom;
Очевидно, вам нужно будет скорректировать имена, чтобы они лучше подходили к вашему коду.
Так как Java и MQL основаны на C++, это может вам помочь.
@JD4 Я не вижу, как размещение кода Java и ссылки на спецификации Java помогают OP. Также Java и C++ похожи, но я не согласен с тем, что он основан на C++.
Хотя вы пытаетесь быть полезным, я думаю, что многие из ваших ответов, когда вы сами не уверены в ответах, приводят только к запутыванию людей, ищущих помощи.
@JD4 Я не вижу, как размещение кода Java и ссылки на спецификации Java помогают OP. Также Java и C++ похожи, но я не согласен с тем, что он основан на C++.
Хотя вы пытаетесь быть полезным, я думаю, что многие из ваших ответов, когда вы сами не уверены в ответах, приводят только к запутыванию людей, ищущих помощи.
Что касается ваших мыслей о C++, посмотрите на https://www.mql5.com/en/docs/basis. Там об этом говорится, и поскольку они модифицировали MQL4, чтобы сделать его более похожим на MQL5(https://docs.mql4.com/mql4changes), это применимо и здесь. Что касается моей базы знаний, я никогда не претендовал на роль эксперта, и я даю людям знать об этом, когда пишу, если я не уверен в чем-то, по крайней мере, я стараюсь, но иногда могу промахнуться.Если я вожу Шевроле, и у меня с ним проблемы, я не собираюсь сидеть здесь и отвергать советы того, кто работает только с Фордами, если это полезный совет, даже если он может быть не совсем верным. Я также не буду сидеть здесь и говорить им, что не думаю, что вы можете помочь, если они делают это, пытаясь быть полезными.
Я думаю, вы неправильно поняли мой пост. Mql4 OO, безусловно, основан на c++. Я не думаю, что это можно оспаривать. Я имел в виду ваше утверждение:
JD4: Since Java and MQL are both supposed to be based on C++, this might help you out.
за которым следует множество ссылок на Java. Я сказал -
ydrol: Также Java и C++ похожи, но я не согласен с тем, что он основан на C++.
Я говорил конкретно о ваших ссылках на Java. Java, на мой взгляд, не основана на c++.
В любом случае, тема представления десятичных дробей с плавающей запятой была рассмотрена несколько раз в темах, упомянутых WHRoeder ранее.
Похоже, что OP хочет округлить до двух знаков после запятой, но, не опубликовав никаких результатов или конкретных примеров, я полагаю, что степень ошибки округления, которую они видят, можно игнорировать.
NoLimitations: JD4 прав, на странице документации сказано, что он округляет до ближайшего целого числа.
Оба неверны. Он округляет до ближайшего целого числа. Не имеет значения. Возвращает двойное число. 1 = 1.0 = 1.00 = 1.00000 = 1.00000000000000000000000000000000000000000000000000 БЕСКОНЕЧНОЕ ЧИСЛО.
Полагаю, что WH нужно вернуться назад и перечитать, я говорил о том, что страница говорит, что функция делает, а не о том, что она делает на самом деле. И компьютерное программирование - одно из немногих мест, где (int) 1 != (double) 1.00000000 (ad infinitum) в отношении типов данных.
@ ydrol, я пропустил направление вашего намерения с вашим заявлением о MQL/Java/C++. Некоторые справочные материалы для вас, чтобы взглянуть на происхождение Java как языка программирования.
Так как они оба говорят почти одно и то же в отношении C++, я приведу цитату из Вики. "Язык берет большую часть своего синтаксиса от C и C++, но имеет меньше низкоуровневых средств, чем любой из них."
Из той же эпохи"Синтаксис языка определяет его поверхностную форму". (фигурные скобки и т.д.). То, что обсуждается в этой теме, не связано с синтаксисом. Я считаю, что утверждение "Java основана на C++" так же, как и MQL, является гораздо более сильным утверждением, с которым я не согласен.
Но поскольку это качественное утверждение, мы можем быть правы и неправы одновременно. Тем не менее, я не вижу, как спецификации Java помогают ОП, когда уже даны конкретные ссылки с вопросом, и это не был вопрос, связанный с синтаксисом.
Обе статьи, которые вы упомянули, подчеркивают, что Java заимствует синтаксис - но не более того. Это не вопрос, связанный с синтаксисом.
Однако он связан с представлением с плавающей точкойIEEE 754, используемым в MQL, которое также разделяется языками. (и многими другими, которые не имеют синтаксиса, подобного си, например, Pascal, или даже приложениями, такими как Excel), и это действительно потому, что это стандарт, поддерживаемый большинством CPU/FPU, а не синтаксическое сходство языков. Проблема в том, что представление десятичных дробей с плавающей точкой имеет небольшие ошибки. ОП хочет округлить до двух знаков после запятой. ФорматIEEE 754 не может точно хранить одну десятую (0.1) или одну сотую (0.01). В двоичном форматеIEEE 754 это повторяющиеся двоичные дроби (так же, как 1/3 является повторяющейся десятичной дробью 0.33333... ) - разница между задуманным числом и фактическим числом довольно мала (например, 0.00000000000001), но она достаточно велика, так что
1/10 != 0.1 // вероятно.
И int(0.1 * 10) может округлиться не в ту сторону.
Но так как OP не указал, что именно они видят, лучший совет был дан еще в 3-м сообщении этой темы, идите и читайте темы MQL. Я не вижу смысла предлагать им также прочитать спецификации Java после того, как MQL потоки были даны, и они, вероятно, не знакомы с Java.
Краткое содержание темы:
OP: Числа ведут себя странно
WHRoeader: Вот несколько ссылок с несколькими объяснениями, почему плавающие точки странные. < Ответ где-то здесь ...
OP: Я понял их, но числа все равно ведут себя забавно.
JD4: MQL4 и Java основаны на C++, вот несколько непонятных ссылок на Java о типизации и продвижении, которые даже Java-разработчики сочтут тяжелым чтением.
ydrol: Как именно это помогает OP? Я не согласен, что Java основана на C++ Ответы были опубликованы некоторое время назад...
Я разместил информацию о способе приведения типов в Java по двум причинам. Во-первых, по общему признанию, потому что я лучше знаком с Java. И во-вторых, я провел поиск кода, и, возможно, потому что я устал, когда делал это, я не увидел, как это сделать в документации MQL. Поэтому, чтобы попытаться быть полезным, я предложил возможное решение, которое, как я был уверен, будет работать, основываясь на предположениях, что MQL и Java достаточно близки друг к другу, учитывая их общие сравнения с общим языком, C++.
JD4: Видимо, WH нужно вернуться и перечитать, я говорил, что на странице сказано, что функция делает, а не что она делает на самом деле.
Возможно, вам стоит вернуться и перечитать вопрос.
NoLimitations: Почему я все еще получаю ответы с несколькими знаками после запятой, если я использую MathRound()?
Что написано на странице, то она и делает. Он округляет. Ничего общего с вопросом о множественных десятичных знаках.
Множественные десятичные знаки - это то, что происходит, когда вы печатаете двойное число без указания необходимого количества.
Вышеизложенное было конкретным ответом на ваше конкретное сообщение"MathRound возвращает двойное число; бесконечное количество десятичных знаков. "
Еще раз, согласно странице документации.
"Возвращаемое значение
Значение, округленное до ближайшего целого числа."
Теперь конкретный ответ на эту часть вашего сообщения.
"Что написано на странице, то и делается. Она округляет. Ничего общего с вопросом о нескольких десятичных знаках."
Опять же, перечитайте цитату, там сказано, что возвращается "Значение, округленное до ближайшего целого числа". Целое число, по определению, это целое число, без десятичных знаков. И опять же, если это не то, что оно делает на самом деле, то код или описание нарушены, и одно или другое или оба должны быть исправлены MQ, или иначе предупреждающая надпись, говорящая, что эти функции не работают так, как рекламируется.
Если она действительно возвращает заданный ей тип, но в математическом эквиваленте ближайшего целого числа (например, возвращает 1.00000 из 1.23456, и 1 == 1.00000), но не возвращает фактический тип целого числа, то на странице ссылки нужно указать что-то вроде "не изменяет базовый тип данных" или как-то иначе, чтобы это было четко указано. Я думаю, что это был плоский перевод с оригинальной русской страницы, и как таковой, он не так ясен на английском, как должен быть.
Я также только что попробовал использовать это безрезультатно. Возможно, DTS просто изменяет точность значения для внешнего вида, а не фактическое значение? Я не вижу других вариантов.
Да, я думаю, что строка просто делает значение в double версией для печати, но не изменяет его. Не уверен, как это сделать в MQL, но я знаю, что в Java можно принудительно преобразовать тип из одного типа в другой (в данном случае double в int).
Из документации oracle по адресу http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html. Это лишь небольшая часть представленного кода.
В вашем случае, я полагаю, вы могли бы сделать так, чтобы здесь было написано что-то вроде
Очевидно, вам нужно будет скорректировать имена, чтобы они лучше подходили к вашему коду.
Так как Java и MQL основаны на C++, это может вам помочь.
@OP, а также прочитать все ссылки на MQL4, размещенные ранее, см. Работа с двойниками и PrintFormat
@JD4 Я не вижу, как размещение кода Java и ссылки на спецификации Java помогают OP. Также Java и C++ похожи, но я не согласен с тем, что он основан на C++.
Хотя вы пытаетесь быть полезным, я думаю, что многие из ваших ответов, когда вы сами не уверены в ответах, приводят только к запутыванию людей, ищущих помощи.
@OP, а также прочитать все ссылки на MQL4, размещенные ранее, см. Работа с двойниками и PrintFormat
@JD4 Я не вижу, как размещение кода Java и ссылки на спецификации Java помогают OP. Также Java и C++ похожи, но я не согласен с тем, что он основан на C++.
Хотя вы пытаетесь быть полезным, я думаю, что многие из ваших ответов, когда вы сами не уверены в ответах, приводят только к запутыванию людей, ищущих помощи.
Я думаю, вы неправильно поняли мой пост. Mql4 OO, безусловно, основан на c++. Я не думаю, что это можно оспаривать. Я имел в виду ваше утверждение:
JD4: Since Java and MQL are both supposed to be based on C++, this might help you out.
за которым следует множество ссылок на Java. Я сказал -
ydrol: Также Java и C++ похожи, но я не согласен с тем, что он основан на C++.
Я говорил конкретно о ваших ссылках на Java. Java, на мой взгляд, не основана на c++.
В любом случае, тема представления десятичных дробей с плавающей запятой была рассмотрена несколько раз в темах, упомянутых WHRoeder ранее.
Похоже, что OP хочет округлить до двух знаков после запятой, но, не опубликовав никаких результатов или конкретных примеров, я полагаю, что степень ошибки округления, которую они видят, можно игнорировать.
Оба неверны. Он округляет до ближайшего целого числа. Не имеет значения. Возвращает двойное число. 1 = 1.0 = 1.00 = 1.00000 = 1.00000000000000000000000000000000000000000000000000 БЕСКОНЕЧНОЕ ЧИСЛО.
Узнайте о плавающей запятой. Операнд ==. - Форум MQL4
Полагаю, что WH нужно вернуться назад и перечитать, я говорил о том, что страница говорит, что функция делает, а не о том, что она делает на самом деле. И компьютерное программирование - одно из немногих мест, где (int) 1 != (double) 1.00000000 (ad infinitum) в отношении типов данных.
@ ydrol, я пропустил направление вашего намерения с вашим заявлением о MQL/Java/C++. Некоторые справочные материалы для вас, чтобы взглянуть на происхождение Java как языка программирования.
https://en.wikipedia.org/wiki/Java_(язык_программирования)
http://www.freejavaguide.com/history.html
Так как они оба говорят почти одно и то же в отношении C++, я приведу цитату из Вики. "Язык берет большую часть своего синтаксиса от C и C++, но имеет меньше низкоуровневых средств, чем любой из них."
Из той же эпохи"Синтаксис языка определяет его поверхностную форму". (фигурные скобки и т.д.). То, что обсуждается в этой теме, не связано с синтаксисом. Я считаю, что утверждение "Java основана на C++" так же, как и MQL, является гораздо более сильным утверждением, с которым я не согласен.
Но поскольку это качественное утверждение, мы можем быть правы и неправы одновременно. Тем не менее, я не вижу, как спецификации Java помогают ОП, когда уже даны конкретные ссылки с вопросом, и это не был вопрос, связанный с синтаксисом.
Обе статьи, которые вы упомянули, подчеркивают, что Java заимствует синтаксис - но не более того. Это не вопрос, связанный с синтаксисом.
Однако он связан с представлением с плавающей точкойIEEE 754, используемым в MQL, которое также разделяется языками. (и многими другими, которые не имеют синтаксиса, подобного си, например, Pascal, или даже приложениями, такими как Excel), и это действительно потому, что это стандарт, поддерживаемый большинством CPU/FPU, а не синтаксическое сходство языков. Проблема в том, что представление десятичных дробей с плавающей точкой имеет небольшие ошибки. ОП хочет округлить до двух знаков после запятой. ФорматIEEE 754 не может точно хранить одну десятую (0.1) или одну сотую (0.01). В двоичном форматеIEEE 754 это повторяющиеся двоичные дроби (так же, как 1/3 является повторяющейся десятичной дробью 0.33333... ) - разница между задуманным числом и фактическим числом довольно мала (например, 0.00000000000001), но она достаточно велика, так что
1/10 != 0.1 // вероятно.
И int(0.1 * 10) может округлиться не в ту сторону.
Но так как OP не указал, что именно они видят, лучший совет был дан еще в 3-м сообщении этой темы, идите и читайте темы MQL. Я не вижу смысла предлагать им также прочитать спецификации Java после того, как MQL потоки были даны, и они, вероятно, не знакомы с Java.
Краткое содержание темы:
Вышеизложенное было конкретным ответом на ваше конкретное сообщение"MathRound возвращает двойное число; бесконечное количество десятичных знаков. "
Еще раз, согласно странице документации.
"Возвращаемое значение
Значение, округленное до ближайшего целого числа."
Теперь конкретный ответ на эту часть вашего сообщения.
"Что написано на странице, то и делается. Она округляет. Ничего общего с вопросом о нескольких десятичных знаках."
Опять же, перечитайте цитату, там сказано, что возвращается "Значение, округленное до ближайшего целого числа". Целое число, по определению, это целое число, без десятичных знаков. И опять же, если это не то, что оно делает на самом деле, то код или описание нарушены, и одно или другое или оба должны быть исправлены MQ, или иначе предупреждающая надпись, говорящая, что эти функции не работают так, как рекламируется.
Если она действительно возвращает заданный ей тип, но в математическом эквиваленте ближайшего целого числа (например, возвращает 1.00000 из 1.23456, и 1 == 1.00000), но не возвращает фактический тип целого числа, то на странице ссылки нужно указать что-то вроде "не изменяет базовый тип данных" или как-то иначе, чтобы это было четко указано. Я думаю, что это был плоский перевод с оригинальной русской страницы, и как таковой, он не так ясен на английском, как должен быть.