Получаем количество десятичных знаков после запятой любых чисел (не только котировок) в обход Digits() на MQL4 и MQL5 - страница 9

 
Mesaoria:

Я вообще не про это писал. Идея с приведением дабла к строке, чтоб потом в строке посчитать знаки - это дичь полнейшая. На чем ни делай.

А что такого? Пока этот вариант самый быстрый, самый функциональный, гарантированно правильный. Какие у вас варианты?

 
Alexandr Sokolov:
Да, мой вариант скорей всего не самый лучший, но так как ранее я ничего не нашёл по этому поводу - это лучшее к чему я самостоятельно додумался, об этом я комментариями выше вам написал, а свой вариант вы так и не предложили

Сравнил вот такие варианты:

int ds(double v){
   string s=(string)v;
   int l=StringLen(s);
   int n=l-StringFind(s,".",0)-1;
   if(StringSubstr(s,l-1,1)=="0")n--;
   return(n);
}

int d(double x){
   int n;
   for(n=0;n<8;n++){
      if(x==NormalizeDouble(x,n)){
         return(n);
      }
   }
   return(n-1);
}

Вариант со строкой чуть-чуть быстрее, к тому же он не ограничен 8-ю знаками, как функция d(). Ну и гарантия правильности - подсчет по тому виду как терминал отображает число.

Выбираю вариант с преобразованием в строку.

 
Dmitry Fedoseev:

А что такого? Пока этот вариант самый быстрый, самый функциональный, гарантированно правильный. Какие у вас варианты?

Вы можете назвать хотя бы один случай применения указанного алгоритма?

 
Mesaoria:

Вы можете назвать хотя бы один случай применения указанного алгоритма?

Был один случай для торговой панели, что бы в текстовое поле выводить размер лота с правильным количеством знаков после запятой. Это единственный случай.

 
Dmitry Fedoseev:

Был один случай для торговой панели, что бы в текстовое поле выводить размер лота с правильным количеством знаков после запятой. Это единственный случай.

Т.е. он в случае 1 лота выводит "1", а 0.01 лота - "0.01"?

 
Mesaoria:

Т.е. он в случае 1 лота выводит "1", а 0.01 лота - "0.01"?

Не совсем так. В зависимости от минимального лота и шага лота. Если минимальный лот 0.01, то 1 отображается как 1.00

 
Dmitry Fedoseev:

Не совсем так. В зависимости от минимального лота и шага лота. Если минимальный лот 0.01, то 1 отображается как 1.00

O.o

Ну так получается, что вы не используете свою функцию, а всё равно выводите что-то вроде DoubleToString(LotSize, <some const value>), нет?

 
Mesaoria:

O.o

Ну так получается, что вы не используете свою функцию, а всё равно выводите что-то вроде DoubleToString(LotSize, <some const value>), нет?

Да. Но ведь надо знать, сколько знаков после запятой выводить.

 
Dmitry Fedoseev:

Да. Но ведь надо знать, сколько знаков после запятой выводить.

Т.е. Вы определяете по введенному юзером значению мин.лота (или шага лота), сколько в этом значении цифр после запятой, потом это сохраняете для нормализации будущих значений?

 
Mesaoria:

Т.е. Вы определяете по введенному юзером значению мин.лота (или шага лота), сколько в этом значении цифр после запятой, потом это сохраняете для нормализации будущих значений?

Что непонятного? У цены есть Digits(), а у объёма - нет. Вот его таким способом и вычисляют.

А зачем нужен digits объёма? Затем же зачем и digits цены!

Причина обращения: