Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 154
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Т.е. вам из цифры 1,33182 надо получить 1,3318? Вам надо просто отбросить 5-ую цифру после запятой или округлить до 4-ой цифры, т.е. например из 1,33186 надо 1,3318 или 1,3319?
У меня вопрос есть баг или нету. При приведении из double в int в моем примере результат выдается на единицу меньше. Проверьте у себя пожалуйста.
Alert должен выдать 13318, а выдает 13317. При этом если не приводить к int, то выдаст правильно 13318.0Скажите, есть ли разница в выражениях:
и
Скажите, есть ли разница в выражениях:
и
Если у вас подозрения что что-то не так как надо, то сделайте так:
У меня вопрос есть баг или нету. При приведении из double в int в моем примере результат выдается на единицу меньше. Проверьте у себя пожалуйста.
Alert должен выдать 13318, а выдает 13317. При этом если не приводить к int, то выдаст правильно 13318.0приводит к отбрасыванию дробной части, а не округлению (т.е. похожа скорее на MathFloor(), нежели на MathRound()), а в вашем случае нормализованное число вполне может быть равно не 13318 ровно, а скажем 13317,999999999999997
, что при выводе в дробном виде с ограниченным числом знаков приводит к округлению до правильного (ожидаемого) результата, а при отбрасывании дробной части.... сами понимаете.
Надеюсь понятно объяснил.
аналог шарповского partial есть? или как сделать?
аналога нет. можно врезать кусок определения при помощи #include <partial_class_code.mqh>
некоторые деятели даже множественное наследование таким способом имитируют. // я этим не занимаюсь, привык обходится без оного. и даже, стесняюсь признаться, нравится. :)
Если у вас подозрения что что-то не так как надо, то сделайте так:
Уже сделал. Просто интересно.
Понятно. Возвращая к вашему предыдущему вопросу суть записи можно провести к такому сравнению:
Разницы между этими записями нет. Заодно рекомендую математические вычисления внутри if-ов заключать в скобки, типа:
if (A<=(B1+B2*B3) && C<=(D1-D2*D3))
Алерт не выдаёт ошибку. Т.е. бага нету. Дело в том что нормализация приводит число к двоичной форме, которая наиболее близка к запрашиваемому десятичному аналогу, при этом может с ним не совпадать в большую или меньшую (в вашем случае) сторону. Поскольку то, что выразимо конечной десятичной дробью, не всегда может быть выражено конечной двоичной. Выражение
приводит к отбрасыванию дробной части, а не округлению (т.е. похожа скорее на MathFloor(), нежели на MathRound()), а в вашем случае нормализованное число вполне может быть равно не 13318 ровно, а скажем 13317,999999999999997
, что при выводе в дробном виде с ограниченным числом знаков приводит к округлению до правильного (ожидаемого) результата, а при отбрасывании дробной части.... сами понимаете.
Надеюсь понятно объяснил.
Спасибо, понятно.
Еще вопрос, как с этим бороться, если без перевода в int не обойтись?
Спасибо, понятно.
Еще вопрос, как с этим бороться, если без перевода в int не обойтись?
а вы пару эпсилонов прибавьте.
DBL_EPSILON
Наименьшее число для которого выполняется условие 1.0+DBL_EPSILON != 1.0