Приветствую всех.
Столкнулся с проблемой.
Написал вот такой код
double pp=2.5;
double pp2=5/2;
Print (pp+" "+pp2);
Получил в итоге 2.5 и 2
Произошло срезание до точки. Не могу записать в переменную вычисление формулы. Началось все с того что я записывал в переменную такую формулу double pp=(X/100)*Y;
Где X=10, а Y=80, в итоге при выводе результата получаю 0.
В чем может быть дело ?
Тут происходит неявное преобразование типов, так как компилятор считает 5 и 2 целым типом и после деления преобразует результат в целое. По этому если напишите вот так: double pp2=5.0/2.0; , то все будет нормально.
Тут происходит неявное преобразование типов, так как компилятор считает 5 и 2 целым типом и после деления преобразует результат в целое. По этому если напишите вот так: double pp2=5.0/2.0; , то все будет нормально.
Даже одного числа в double будет достаточно, так как в операциях умножения и деления второе автоматом приведется к double
Ну это так, мелочное уточнение ))
А вообще, деление медленная операция, лучше вот так
double pp2=5.0 * 0.5
Привет!
Параметры можно задать в начале, тогда будет как надо)).
double A=5;
double S=2;
double pp=2.5;
double pp2=A/S;
Print (pp+" "+pp2);
Приветствую всех.
Столкнулся с проблемой.
Написал вот такой код
double pp=2.5;
double pp2=5/2;
Print (pp+" "+pp2);
Получил в итоге 2.5 и 2
Произошло срезание до точки. Не могу записать в переменную вычисление формулы. Началось все с того что я записывал в переменную такую формулу double pp=(X/100)*Y;
Где X=10, а Y=80, в итоге при выводе результата получаю 0.
В чем может быть дело ?
С формулами проблем нет, есть проблемы с непониманием типов, это уже ответили выше.
В вашей формуле достаточно было поставить маленькую точку и всё будет работать.
У вас вот тут --> double pp=(X/100)*Y; есть 3 ячейки памяти X 100 и Y, при этом если хоть одна из них будет double, то при операции с ней всё остальное тоже будет double (это автоматическое приведение типов).
Но видимо ни одна из ячеек у вас не double, раз результат 0. Ведь если X Y объявлены как int, а 100 в данном контексте компилятором читается тоже как int, то 10/100=0 а 0*80=0. Так что машинка всё верно посчитала.
Но вот если в формуле поставить после 100 точку, результат будет другим:
double pp=(X/100.)*Y; проверьте, даже если X Y объявлены как int, формула посчитает то что вам нужно.
Старайтесь константы писать в том типе в каком они должны использоваться чтоб потом не париться, особенно если константы используются в вычислениях а не в присвоениях.
вот так double k=100; прокатит. А вот так double k=x*100; может не прокатить если x int.
1. double pp=(X/100.)*Y; проверьте, даже если X Y объявлены как int, формула посчитает то что вам нужно.
Старайтесь константы писать в том типе в каком они должны использоваться чтоб потом не париться, особенно если константы используются в вычислениях а не в присвоениях.
2. вот так double k=100; прокатит. А вот так double k=x*100; может не прокатить если x int.
П.2 противоречит п.1. П.1 при целом Х скорее не прокатит.
Ну, это я так, чтобы разговор поддержать.)
П.2 противоречит п.1. П.1 при целом Х скорее не прокатит.
Ну, это я так, чтобы разговор поддержать.)
))
Прокатит уверяю вас. Первым действием будет X/100.
перед исполнением компилятор приведёт X к типу double, чтоб оба операнда были одного типа.
далее в стеке имеем результат типа double и с ним нужно произвести операцию умножения на Y, естествено что опять оба операнда будут автоматически приведены к double.
Кто не верит проверка займёт 13 секунд.
Открыл ME, сгенерил скрипт, написал Print(pp); сверху прикопипастил синию формулу. F7, и запуск в МТ. Результат налице )))
ЗЫ И да, П.1 и П.2 не противоречат друг другу, старайтесь не значит это обязательно. Присвоение в переменную это действие, но это последнее действие в выражении.
Если в double k=100; оно единственное.
То в k=x*100; перед присвоением ещё есть действия, результат непременно при присвоении в переменную k будет приведён, но нам то нужно чтоб он был приведёт ещё на стадии расчётов.
))
Прокатит уверяю вас. Первым действием будет X/100.
перед исполнением компилятор приведёт X к типу double, чтоб оба операнда были одного типа.
далее в стеке имеем результат типа double и с ним нужно произвести операцию умножения на Y, естествено что опять оба операнда будут автоматически приведены к double.
Кто не верит проверка займёт 13 секунд.
Открыл ME, сгенерил скрипт, написал Print(pp); сверху прикопипастил синию формулу. F7, и запуск в МТ. Результат налице )))
От компилятора зависит. В большинстве тип определяется по первому операнду, т.е., по Х. Т.е., (double)X, и все проблемы для Х/100 или Х*100 решены.
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Приветствую всех.
Столкнулся с проблемой.
Написал вот такой код
double pp=2.5;
double pp2=5/2;
Print (pp+" "+pp2);
Получил в итоге 2.5 и 2
Произошло срезание до точки. Не могу записать в переменную вычисление формулы. Началось все с того что я записывал в переменную такую формулу double pp=(X/100)*Y;
Где X=10, а Y=80, в итоге при выводе результата получаю 0.
В чем может быть дело ?