Замените 15 на 15.0 и перепроверьте результат.
Затем читайте маны про преобразование int-double до полного вкуривания.
результат MathFloor(15.0*0.01/0.05) остаётся всё так же неправильный.
Так что преобразование тут ни при чём.
Ещё будут варианты умников?
Вопрос по-прежнему адресуется разработчикам.
Так что преобразование тут ни при чём.
Ещё будут варианты умников?
Ни при чем. Уел. В данном случае корректней пользоваться MathRound из-за потери точности при вычислении.
В первом выражении погрешность вверх, во втором вниз, отсюда и разность результатов. В любом случае в терминале ошибки нет.
Запускаем то же самое в Visual Studio.
std::cout << floor(15/0.05*0.01); // дает 3
std::cout << floor(15*0.01/0.05); // дает 2
C'est la vie.
.
НО: с чем соглашусь: если Mql язык для трейдеров-
вынь да положь вычисления без этих нюансов :-P.
.
P.S.: умножение на 0.01- это, по идее, просто вычитание
двойки из мантиссы. Куда там девается точность-
ума не приложу.
В данном случае корректней пользоваться MathRound из-за потери точности при вычислении.
В любом случае в терминале ошибки нет.
MathRound не подходит. Нужна целая часть числа, а не округление. Если округлять - то часто превышаются риски, а это недопустимо.
А ошибка разработчиков всё-таки есть, так как результат MathFloor(15.0*0.01/0.05) не может быть 2, как говорит МТ4
Ответ не получен. Результат MathFloor(15.0*0.01/0.05) по-прежнему 2, что есть неправильно.
Преобразование в double ничего не даёт в данном случае.
Настоящая проблема в том, что MathFloor() довольно часто используется, и подобных несоответствий истинному результату может быть много.
MathRound не подходит. Нужна целая часть числа, а не округление. Если округлять - то часто превышаются риски, а это недопустимо.
А ошибка разработчиков всё-таки есть, так как результат MathFloor(15.0*0.01/0.05) не может быть 2, как говорит МТ4
Почему так сразу кто-то виноват, а не я себе любимый? Надо правильно даблами пользоваться - MathFloor(NormalizeDouble(15.0*0.01/0.05,8));
Почему так сразу кто-то виноват, а не я себе любимый? Надо правильно даблами пользоваться - MathFloor(NormalizeDouble(15.0*0.01/0.05,8));
А вот так работает правильно:
Print("MathFloor(15/0.05*0.01) = ",MathFloor(15/0.05*0.01)); Print("MathFloor(15*0.01/0.05) = ",MathFloor(15*0.01/0.05+0.00000000000001));
Можно делать вывод где собака порылась....
P.S. Я бы ни студии, ни борланду и вообще никому не доверял бы. Берешь асм и пишешь на нем совершенно надежную свою функцию и ей доверяешь.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Сообщение направляю разработчикам:
результат MathFloor(15/0.05*0.01) будет 3,
результат MathFloor(15*0.01/0.05) будет 2,
хотя в обоих случаях должно быть 3 !
Вывод: функция MathFloor() работает неправильно.
MathFloor() - нужная функция, используется постоянно, при больших депозитах разбег будет колоссальный.
Ждём устранения бага в следующем билде МТ4.