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

Alexandr Sokolov  

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


Как оказалось суть банально простая, но всё же имеет один недостаток - эта функция не распознаёт нули если после них нет иных цифр. Например если функции дать число 0,01 она вернёт 2, а если 0,0000 она вернёт 0 (то есть четыре нуля она не видит). Поэтому учитывайте этот недостаток в своих разработках


Код на MQL4

int Digits_values(double value)
  {
   int digits = 0;
   string string_value = (string)value;
   int limit = StringLen(string_value);
   for(int i = 1; i < limit; i++)
     {
      if(StringSubstr(string_value,i,1) == ".")
        {
         digits = limit - (i + 1); break;
        };
     };
  //-----------------------------------------------------------------
   return(digits);
  }


Код на MQL5

int Digits_values(double value)
  {
   int digits = 0;
   string string_value = (string)value;
   int limit = StringLen(string_value);
   for(int i = 1; i < limit; i++)
     {
      if(StringSubstr(string_value,i,1) == ".")
        {
         if(i == limit - 2)
           {
            if(StringSubstr(string_value,limit-2,1) == "." && StringSubstr(string_value,limit-1,1) == "0")
              {
               break;
              }
            else
              {
               digits = 1; break;
              };
           }
         else
           {
            digits = limit - (i + 1); break;
           };
        };
     };
  //-----------------------------------------------------------------
   return(digits);
  }

Код на MQL5 пришлось немного доработать, так как по всей видимости на MQL5 для переменных типа double автоматически присваивается ,0 в конце вне зависимости от того целое число ей присваивается или нет. И по этой причине функция никогда не возвращала 0

Vitaly Muzichenko  
Alexandr Sokolov:

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

Как оказалось суть банально простая, но всё же имеет один недостаток - эта функция не распознаёт нули если после них нет иных цифр. Например если функции дать число 0,01 она вернёт 2, а если 0,0000 она вернёт 0 (то есть четыре нуля она не видит). Поэтому учитывайте этот недостаток в своих разработках

Код на MQL5 пришлось немного доработать, так как по всей видимости на MQL5 для переменных типа double автоматически присваивается ,0 в конце вне зависимости от того целое число ей присваивается или нет. И по этой причине функция никогда не возвращала 0

Предположим, дадим число 2,4875, функция вернёт 4.

А что дальше с этим делать? Что-то Я не уловил смысл(

Maxim Kuznetsov  
Alexandr Sokolov:

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


Как оказалось суть банально простая, но всё же имеет один недостаток - эта функция не распознаёт нули если после них нет иных цифр. Например если функции дать число 0,01 она вернёт 2, а если 0,0000 она вернёт 0 (то есть четыре нуля она не видит). Поэтому учитывайте этот недостаток в своих разработках


Код на MQL4


Код на MQL5

Код на MQL5 пришлось немного доработать, так как по всей видимости на MQL5 для переменных типа double автоматически присваивается ,0 в конце вне зависимости от того целое число ей присваивается или нет. И по этой причине функция никогда не возвращала 0

после
string string_value = (string)value;

можно дальше не читать :-)

Alexandr Sokolov  
Vitaly Muzichenko:

Предположим, дадим число 2,4875, функция вернёт 4.

А что дальше с этим делать? Что-то Я не уловил смысл(

В зависимости от того кому что нужно. Например мне для того чтобы было проще вычислить индекс коррелирования нужны были целые числа

Alexandr Sokolov  
Maxim Kuznetsov:

можно дальше не читать :-)

А что для программиста тут не понятно?))

fxsaber  

Выдрал

int GetDigits( double Price )
{
  int Res = 0;

  while ((bool)(Price = ::NormalizeDouble(Price - (int)Price, 8)) && (Res < 8))
  {
    Price *= 10;

    Res++;
  }

  return(Res);
}
A100  
Alexandr Sokolov:

тоже хорошее решение

Хорошее решение обычно работает правильно

void OnStart()
{
        double price = 500000000.0001;
        Print( price, ":", GetDigits( price ));
}

Результат: 500000000.0001:8

Cколько цифр после запятой? Неужели 8 ?

fxsaber  
A100:

Хорошее решение обычно работает правильно

Результат: 500000000.0001:8

Cколько цифр после запятой? Неужели 8 ?

Да, восемь.