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

 
Igor Makanu:

не, не прокатит...

А, ну да, я забыл, что он был сделан заведомо для чисел меньше нуля, т.к. использовался при нормализации лота. Исправил, теперь все ок:

#define EPSILON   0.000000001
#define MORE(A,B) ((A)-(B)>EPSILON)

int Digit(double value)
  {
   int digits=0;
   value=MathMod(value,1.0);
   while(MORE(1.0/MathPow(10,digits),value)) 
      digits++;
   return(digits);
  }
//+------------------------------------------------------------------+
int DoubleToDigits(double value)
 {
   double absvalue=NormalizeDouble(fabs(value-int(value)),15);
   int res=StringLen(string(absvalue))-2;
   return(res<=0?0:res);
 }
//+------------------------------------------------------------------+
void OnStart()
  {
   double f = 122334550.007;
   Print("1. DoubleToDigits() = ",DoubleToDigits(f));
   Print("1. Digit() = ",Digit(f));
   f = 0.007;
   Print("2. DoubleToDigits() = ",DoubleToDigits(f));
   Print("2. Digit() = ",Digit(f));
  }  

Результат:

2018.11.13 05:18:40.599 Digits (EURUSD,M1)      1. DoubleToDigits() = 11
2018.11.13 05:18:40.599 Digits (EURUSD,M1)      1. Digit() = 3
2018.11.13 05:18:40.599 Digits (EURUSD,M1)      2. DoubleToDigits() = 3
2018.11.13 05:18:40.599 Digits (EURUSD,M1)      2. Digit() = 3
 
Деньги, заработанные на Форекс, вложу в бар "Веселый трейдер". В Лондоне открою. 
 
Konstantin Gruzdev:

А, ну да, я забыл, что он был сделан заведомо для чисел меньше нуля, т.к. использовался при нормализации лота. Исправил, теперь все ок:

Результат:

неее, не прокатило

double f = 122334550.00999;

результат:

2018.11.13 02:36:31.034 tst (EURUSD,M30) 1. Digit() = 3


 
Господи, дай возможность детям этих людей учить физику. 
 
Igor Makanu:

неее, не прокатило

а, точно, понял в чем дело) ща исправлю

 
Алексей Тарабанов:
Господи, дай возможность детям этих людей учить физику. 

Зачем, если родители обходятся без этого?

 

Для начала ответьте сами себе - зачем знать, сколько цифр после запятой? Чтобы что?

Единственным правильным способом использования "double с цифрами" является использование его с некоторой заданной точностью, наперёд известной в рамках решаемой задачи.

Всё остальное - чепуха.

Я даже не говорю о том, что чем больше значение double по модулю - тем меньше его точность и любой алгоритм (особенно с приведением к строке, это вообще за гранью) будет лажать.

 
Mesaoria:

(особенно с приведением к строке, это вообще за гранью) будет лажать.

это коды под MQL, а не под стандартный С++, то что в С++ работа со строками будет подтупливать "и ежу понятно", в MQL встроенные функции быстрее выполняются, чем самописные функции 

 
Igor Makanu:

это коды под MQL, а не под стандартный С++, то что в С++ работа со строками будет подтупливать "и ежу понятно", в MQL встроенные функции быстрее выполняются, чем самописные функции 

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

 
Mesaoria:

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

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