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

 
A100:

Нужна такая

чтобы

результат был равен: 4

Именно 4? Сделаем. 

 
fxsaber:

Возможно, Вам именно такая функция и нужна. Отвечал же ТС

Ему именно такая и нужна, потому что (как Вы правильно заметили) далеко не все числа могут быть точно представлены в виде double, а значит решение поставленной задачи без указания точности не имеет смысла (потому что в общем случае приводит к абсурдным результатам)

 
A100:

Ему именно такая и нужна, потому что (как Вы правильно заметили) далеко не все числа могут быть точно представлены в виде double, а значит решение поставленной задачи без указания точности не имеет смысла (потому что в общем случае приводит к абсурдным результатам)

А какие могут быть варианты указания точности не изменяя количество знаков после запятой или как устранить тот недостаток который я описал в своём варианте? Для себя я нашел только (string)value

 
Alexandr Sokolov:

А какие могут быть варианты указания точности не изменяя количество знаков после запятой или как устранить тот недостаток который я описал в своём варианте? Для себя я нашел только (string)value

Наверно имеется ввиду в каких пределах искать последний не ноль.

 

пробовал сделать расчет кол-ва знаков после запятой через MathMod() с последовательным делителем 0.1 , затем 0.01 ...0.000(15 нулей) 1 , не прокатило, точность числа все время "плывет" нужно нормализовать каждый раз, а если использовать нормализацию, тогда проще сравнивать искомое число и нормализованное до какого знака - если отличаются, значит нашли последний знак

ЗЫ: есть еще вариант, не успел проверить - умножить вещественное число без целой части на 10^16 и в lоng все это сохранить, а потом  делить на 10 и проверять остаток от деления, если = 0, то опять делим

 
Igor Makanu:

ЗЫ: есть еще вариант, не успел проверить - умножить вещественное число без целой части на 10^16 и в lоng все это сохранить, а потом  делить на 10 и проверять остаток от деления, если = 0, то опять делим

Не прокатит.

 
Используйте double  Point()
Десятичный логарифм, знак отбросить...
 
Aliaksandr Hryshyn:
Используйте double  Point()
Десятичный логарифм, знак отбросить...

Тоже проверено, не прокатит.

Вот это

void OnStart()
{
 double p = 0.07;
 Print(p);
}/*******************************************************************/

Даёт такой результат

2018.11.05 10:43:05.138 !00 (GBPJPY,H1) 0.07000000000000001
Догадайтесь с трёх раз какой будет логарифм...
 
Alexey Viktorov:
Тоже проверено, не прокатит.
Почему? Дальше округлять к целому.
 
Посмотрите, что возвращает функция Point().
Причина обращения: