Возможно ли получить "точное" значение? - страница 2

 

а вот такое значение

0.099999999

вернёт 0.1

)

 

тогда то что выше приводили правильней будет под задачу ТС:

void OnStart()
  {
//---
   int DIGITS=2;
   string stroka=DoubleToString(0.099999999,8);
   int P=StringFind(stroka,".");
   Print(stroka);
   stroka=StringSubstr(stroka,0,P+DIGITS+1);
   Print(StringToDouble(stroka));
   Print(NL(DIGITS,0.099999999));
   
  }
//+------------------------------------------------------------------+
double NL (int DIGITS,double value) {
   double step=1/MathPow(10,DIGITS);
   return (MathFloor(value/step)*step);
}

возвращает:

2014.10.04 11:42:31.856 normalize EURUSD,H4: 0.09
2014.10.04 11:42:31.856 normalize EURUSD,H4: 0.1
2014.10.04 11:42:31.856 normalize EURUSD,H4: 0.10000000
 

Набросал функцию, делающая именно то, что нужно: точно обрезает в отличи от DoubleToStr строку до указанной точности:

string Normalize (string Normalize_Parse, int Normalize_Number, string Normalize_Separator = ".")
{
   string Normalize_Before,
          Normalize_After;
   
   for (int i = 0; i <= StringLen (Normalize_Parse) - 1; i ++)
   {
      if (StringSubstr (Normalize_Parse, i, StringLen (Normalize_Separator)) == Normalize_Separator)
      {
         for (int ii = i + StringLen (Normalize_Separator); ii < i + StringLen (Normalize_Separator) + Normalize_Number; ii ++)
         {
            Normalize_After += StringSubstr (Normalize_Parse, ii, 1);
         }
         
         break;
      }
      
      Normalize_Before += StringSubstr (Normalize_Parse, i, 1);
   }
   
   return (Normalize_Before + (Normalize_After > 0 ? Normalize_Separator + Normalize_After : ""));
}

Результат для "0.09864724":

Comment (Normalize (0.09864724, 2)); // 0.09

Результат для "0,-843158":

Comment (Normalize ("0,-843158", 3, ",-")); // 0,-843

Операции с double и подобным:

Comment ((double) Normalize (0.09, 2) * 5); // 0.45

Я прохо искал и такая функция уже есть в MQL4 (5?). Если ее нет, то почему бы ее не добавить уже давно? :)

 
WePlexus:

Набросал функцию, делающая именно то, что нужно: точно обрезает в отличи от DoubleToStr строку до указанной точности:

Результат для "0.09864724":

Результат для "0,-843158":

Операции с double и подобным:

Я прохо искал и такая функция уже есть в MQL4 (5?). Если ее нет, то почему бы ее не добавить уже давно? :)

вот это я понимаю, "проще" )
 
WePlexus:

Набросал функцию, делающая именно то, что нужно: точно обрезает в отличи от DoubleToStr строку до указанной точности:

Результат для "0.09864724":

Результат для "0,-843158":

Операции с double и подобным:

Я прохо искал и такая функция уже есть в MQL4 (5?). Если ее нет, то почему бы ее не добавить уже давно? :)

вы оперируете с не совсем характерными примерами -- поэтому не може делать вывод, что ваша функция работает верно.

возьмите такой пример:

как от числа =0.01999999999999999999 -- оставить =0.01
 
abolk:
вы оперируете с не совсем характерными примерами -- поэтому не може делать вывод, что ваша функция работает верно.

возьмите такой пример:

как от числа =0.01999999999999999999 -- оставить =0.01
проверил последнюю функцию, оставляет 0.01
 

Я так и не понял, что вы хотите.

Если хотите на графике вместо 0.098  увидеть 0.09, то сделайте так!

 

int a=0.098 * 100;  

double d=a/100.0;

Comment(StringFormat( "%G", d )); 

 
sanyooooook:
проверил последнюю функцию, оставляет 0.01
проверил твою функцию -- оставляет 0.02
 
abolk:
проверил твою функцию -- оставляет 0.02

Действительно, 0.02.

Моя функция, может и громозднее, но обрезает именно 0.01.

 
sanyooooook:
проверил последнюю функцию, оставляет 0.01
Как можно твою функцию оптимизировать, чтобы брало 0.01 из примера abolk?
Причина обращения: