String может быть равно любому значению, если это значение NULL?

 

Добрый день.

Очередной вопрос возник.

Очень захотелось записать число типа double как string. Взял функцию DoubleToString. Прогнал через нее нужное мне число. Стринговая переменная оказалась равна NULL. Удивился.

Попробовал разными способами занести в переменную типа string значения.

Результат теста на скрине.

И еще любопытный момент. Функция NormalizeDouble тоже странно отработала. Вместо того, чтобы округлить до 6 знака, и отрезать хвост, она округлила и хвост, изменив, оставила.


 
Скорее, отладчик чудит.
 
knodit:


У меня сегодня тоже string переменные, через раз показывали значение отличное от NULL.

Видать разрабы балуются)

 
Sergey Gridnev #:
Скорее, отладчик чудит.

Не.. У меня скрипт, который нормально выгрузку данных делал - не отработал. Начал разбираться - наткнулся на фокусы со стринговыми переменными. Отладчик только показывает состояние дел. Это же не квантовая физика, в которой наблюдатель влияет на наблюдаемую систему. )

 
Sergey Gridnev #:
Скорее, отладчик чудит.

Или оптимизатор. Переменные-то дальше не используются, нафига им что-то реально присваивать?

 
knodit:


И еще любопытный момент. Функция NormalizeDouble тоже странно отработала. Вместо того, чтобы округлить до 6 знака, и отрезать хвост, она округлила и хвост, изменив, оставила.


Не обратил на это внимание срезу. Тут не в округлении дело, а в преобразовании из десятичной дроби в двоичную. Не каждое дробное число десятичной системы счисления может быть представлено дробным числом двойной системы счисления.
 
JRandomTrader #:

Или оптимизатор. Переменные-то дальше не используются, нафига им что-то реально присваивать?

Ну, да. Скорее всего так.
 
JRandomTrader #:

Или оптимизатор. Переменные-то дальше не используются, нафига им что-то реально присваивать?

Не в оптимизаторе дело. Компилировал и с оптимизацией и без нее. Сделал comment после присваивания.

Но сразу ясно было, что не в этом дело. Переменные типа double, int, bool - в скрипте, где есть только присваивание - показываются в отладке корректно. Только string расстраивают.




 
Sergey Gridnev #:
Не обратил на это внимание срезу. Тут не в округлении дело, а в преобразовании из десятичной дроби в двоичную. Не каждое дробное число десятичной системы счисления может быть представлено дробным числом двойной системы счисления.

Интересные вещи Вы говорите. А вот мануал с Вами не согласен.


NormalizeDouble

Округление числа с плавающей точкой до указанной точности.

double  NormalizeDouble(
   double  value,      // нормализуемое число
   int     digits      // кол-во знаков после запятой
   );

Параметры

value

[in] Величина с плавающей точкой.

digits

[in]  Формат точности, число цифр после десятичной точки (0-8).

Возвращаемое значение

Значение типа double с заданной точностью.
Документация по MQL5: Проверка состояния / Digits
Документация по MQL5: Проверка состояния / Digits
  • www.mql5.com
Digits - Проверка состояния - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
knodit #:

Интересные вещи Вы говорите. А вот мануал с Вами не согласен.

Вы попробуйте то десятичное число привести к двоичному представлению, а затем из полученного двоичного представления восстановите десятичное. А потом расскАжите, с чем мануал не согласен. ;)