StringToDouble проблема с преобразованием значений меньше 0.0001

 

Пример скрипта

void OnStart() {

   Print((string)StringToDouble("1.1"));
   Print((string)StringToDouble("1.01"));
   Print((string)StringToDouble("1.001"));
   Print((string)StringToDouble("1.0001"));
   Print((string)StringToDouble("1.00001"));
   Print((string)StringToDouble("1.000001"));
   Print((string)StringToDouble("1.0000001"));
   Print((string)StringToDouble("1.00000001"));
   Print((string)StringToDouble("0.1"));
   Print((string)StringToDouble("0.01"));
   Print((string)StringToDouble("0.001"));
   Print((string)StringToDouble("0.0001"));
   Print((string)StringToDouble("0.00001"));
   Print((string)StringToDouble("0.000001"));
   Print((string)StringToDouble("0.0000001"));
   Print((string)StringToDouble("0.00000001"));
   
}


Последние 4 значения будут битые

Вывод

 
Evgeniy Arapov:

Пример скрипта


Последние 4 значения будут битые


нормально все. Это просто экспоненциальная запись числа double:  10 в степени минус 6 = 1/1000000 = 0.000001

Print(1+1e-06);                 // 1.000001
Print(1+1e+06);                 // 1000001.0
Print(1e-06==0.000001);         // true


Совет: не используйте никогда функцию StringToDouble.
Не существует таких ситуаций, где она бы пригодилась для профессионального кода. Числа не должны храниться в стрингах.

DoubleToString можно. Для вывода на экран.

 
Nikolai Semko:

нормально все. Это просто экспоненциальная запись числа double:  10 в степени минус 6 = 1/1000000 = 0.000001


Совет: не используйте никогда функцию StringToDouble.
Не существует таких ситуаций, где она бы пригодилась для профессионального кода. Числа не должны храниться в стрингах.

DoubleToString можно. Для вывода на экран.

Николай, вы не правы. Вот пример:

Надо задать переменное количество чисел во входящие параметры советника. Может быть 2 и может быть 7… и никто не знает сколько вбредёт в голову пользователю.

Выход:

sinput  string Indents = "0.3,0.6";    //  Проценты через запятую
double arrIndent[];

и в OnInit() преобразование в double массив

  string strIndents[];
  StringSplit(Indents, ',', strIndents);
  ArrayResize(arrIndent, ArraySize(strIndents));
  int d = 0;
  while(ArraySize(strIndents)-d > 0  && !IsStopped())
   {
    arrIndent[d] = StringToDouble(strIndents[d]);
    d++;
   }
 
Alexey Viktorov:

Николай, вы не правы. Вот пример:

Надо задать переменное количество чисел во входящие параметры советника. Может быть 2 и может быть 7… и никто не знает сколько вбредёт в голову пользователю.

Выход:

и в OnInit() преобразование в double массив

Ну ладно, уговорили. Для ввода в OnInit могут быть ситуации. 
Но после инициализации использование функции StringToDouble - это явный признак непрофессионализма.
Просто я такое встречал. Режет глаз.
StringToDouble - только для ввода 
DoubleToString - только для вывода.
 
Разобрался, проблема не в парсинге значений из строки, а в преобразовании в строку через (string)
 
Evgeniy Arapov:
Разобрался, проблема не в парсинге значений из строки, а в преобразовании в строку через (string)

Чего? Там нет никакой проблемы.