Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Интересует активность в Сигналах? Заходи и отслеживай!
Nazar
23
Nazar 2015.08.21 10:04 

после неправильных расчетов программы,засомневался и проверил вот так:

тип переменных дабл 

void start(){

                 Nl50S = (1.1261 - (1.12 + 0.0033))*10000 / 4;
                 NNl50S = NormalizeDouble(Nl50S,0);
                   if(NNl50S > Nl50S) NNl50S -= 1;
                   Alert(" Nl "+Nl50S+" NNl "+NNl50S);
 

 } 

соответственно результат:       получается целое число "за уши" приводится к даблу?

 

Ihor Herasko
8426
Ihor Herasko 2015.08.21 11:30  

Для вещественных чисел не бывает целых значений - издержки двоичной записи. Поэтому для числа 7 нет точного представления, а только приблизительное (в данном случае меньшее, чем 7). Если необходимо представить число целым, то приводите к целому типу путем округления:

int intValue = int(MathRound((1.1261 - (1.12 + 0.0033))*10000 / 4));

P. S. Пользуйтесь правильной вставкой кода - кнопка SRC.

Dina Paches
7058
Dina Paches 2015.08.21 12:03  
parodent:

после неправильных расчетов программы,засомневался и проверил вот так:

тип переменных дабл 

void start(){

                 Nl50S = (1.1261 - (1.12 + 0.0033))*10000 / 4;
                 NNl50S = NormalizeDouble(Nl50S,0);
                   if(NNl50S > Nl50S) NNl50S -= 1;
                   Alert(" Nl "+Nl50S+" NNl "+NNl50S);
 

 } 

соответственно результат:       получается целое число "за уши" приводится к даблу?

 

Обратите внимание на сообщения при компиляции вашего тестового кода.

Загляните в Документацию, в Преобразование данных.

При преобразовании чисел в текст, чтобы не было искажений числа за счёт преобразований, применяйте специально предназначенные для этого функции (к выводу инфы через Alert это так же относится):

  • для типа double при выводе на печать через Print, Alert, Label и т.д., применяйте Doubletostring.


P./S.: NormalizeDouble - для округления числа типа double и предназначен. Но когда выводите такое число на печать, его всё равно дополнительно нужно преобразовать в текст. Через Doubletostring. Инфа об этом есть и в описании к NormalizeDouble в Документации.

Dina Paches
7058
Dina Paches 2015.08.21 12:18  
parodent:

P./.S.: Кроме того, обратите внимание на особенности сравнения чисел типа double.

Много полезной инфы можно узнать по поиску на сайте.

Да и тему "Навигатор по форуму и ответы на часто задаваемые вопросы. Настоятельно Рекомендуется к Прочтению!", не просто так закреплённую в верхнем списке форумных тем, не мешает вам прочесть.

Там и о сравнении чисел типа double инфа есть и о SRC при вставке кода.

Nazar
23
Nazar 2015.08.21 12:42  
DiPach:

P./.S.: Кроме того, обратите внимание на особенности сравнения чисел типа double.

Много полезной инфы можно узнать по поиску на сайте.

Да и тему "Навигатор по форуму и ответы на часто задаваемые вопросы. Настоятельно Рекомендуется к Прочтению!", не просто так закреплённую в верхнем списке форумных тем, не мешает вам прочесть.

Там и о сравнении чисел типа double инфа есть и о SRC при вставке кода.

спасибо !
Dina Paches
7058
Dina Paches 2015.08.21 12:48  
parodent
И вам всего доброго!
LRA
317
LRA 2015.08.25 13:37  

При выводе Алертом или Принтом преобразование все равно выполняется.

Так вот: оно должно выполняться по правилам Дабл Ту Стр  и  Инт Ту Стр.

Количество цифр в результате должно браться в соответствии с точностью представления исходного типа - чтоб целое выглядело целым.

В приведенном выше примере 6,999999999999784 следует брать 12 десятичных знаков, тогда произойдет округление до 7,000000000000

В правильных языках программирования так и делается.

Вряд ли этично возлагать эту работу на пользователя.

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий