Тут все просто. У Вас целочисленная константа 54 делится на 100. Получается 0,54, но МТ пытается привести ее к (int). Это ноль. Ну а дальше ноль умножается на 54 и т.д.
Добавлено:
Вот так
int period_2=(int)MathRound(54.0/100.0*54.0+54); Comment(period_2);
работает
тема появляется с периодичностью в 2 недели :)
54 / 100 = 0
54.0 / 100 = 54 / 100.0 = 0,54
Объяснение:
int / int = int
double / int = double
int / double = double
Точнее не кто-то, а что-то...
Считаю в калькуляторе:
54 / 100 * 54 + 54 = 83,16
Считаю в советнике:
результат = 54.
Мозг плавится. Что где не так?
(54/100) * 54 = 29,16
54 / (100*54) = 0,01
Тут все просто. У Вас целочисленная константа 54 делится на 100. Получается 0,54, но МТ пытается привести ее к (int). Это ноль. Ну а дальше ноль умножается на 54 и т.д.
Добавлено:
Вот так
работает
Нууу, косяк... Я искренне считал, что раз уж double MathRound(double value), то внутри всё само должно привестись к даблу....
Спасибо.
period_2 = (int)MathRound(54 / 100 * 54 + 54); я обычно добавляю явное преобразование в таком если виде то period_2 = (int)MathRound(54 / 100.0 * 54 + 54); или еще так period_2 = (int)MathRound(54 / (double)100 * 54 + 54);
(54/100) * 54 = 29,16
54 / (100*54) = 0,01
Неверно, последовательность вычислений именно в таком выражении 54 / 100 * 54 будет строго слева направо и результат будет эквивалентен (54/100) * 54.
Не путайте с оптимизацией логических выражений. Кстати, а MQL5 ее вообще делает? Во взрослых компиляторах такая оптимизация включается или отключается ключом.
Неверно, последовательность вычислений именно в таком выражении 54 / 100 * 54 будет строго слева направо и результат будет эквивалентен (54/100) * 54.
Не путайте с оптимизацией логических выражений. Кстати, а MQL5 ее вообще делает? Во взрослых компиляторах такая оптимизация включается или отключается ключом.
Да, перепутал, читал у Прата похожую ситуацию: float logs = 120 / 4 * 5
потом шел такой пример:
int dues = 20 * 5 + 24 * 6;
Можно было бы предположить, что в соответствии со свойством ассоциативности должна быть выполнена операция слева, однако в данном случае две операции умножения не относятся к одному и тому же операнду, поэтому эти правила здесь не могут быть применены. В действительности выбор порядка выполнения операций, который будет приемлемым для системы, оставлен за конкретной реализацией C++.
Захаров правильно подметил по целочисленному результату: 54 / 100 = 0
Неверно, последовательность вычислений именно в таком выражении 54 / 100 * 54 будет строго слева направо и результат будет эквивалентен (54/100) * 54.
Не путайте с оптимизацией логических выражений. Кстати, а MQL5 ее вообще делает? Во взрослых компиляторах такая оптимизация включается или отключается ключом.
На мой взгляд достаточно мутная, не очевидная ситуация.
double ddd; ddd = 54 / 100; Comment(ddd);
Результат вы знаете. Но, возможно, стоит приводить тип не результата, а операндов?
Ну или выдать предупреждение...![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Точнее не кто-то, а что-то...
Считаю в калькуляторе:
54 / 100 * 54 + 54 = 83,16
Считаю в советнике:
результат = 54.
Мозг плавится. Что где не так?