MQL4 ve MQL5'te Rakamları () atlayarak herhangi bir sayıdan (sadece tırnak işaretleri değil) sonra ondalık basamak sayısını alma

 

Ondalık noktadan sonra ondalık basamak sayısını almak gerektiğinde nadir bir durum yaşayan tek ben değilim sanırım ve Digits() işlevi sadece tırnak işaretleri ile çalışıyor ve ayrıca bununla ilgili hiçbir bilgi yok herhangi bir yerde (en azından bu yazıyı daha önce yazarken bulamadım, bu yüzden bulduğum çözümü göstermek istiyorum)?


Görünüşe göre, öz çok basit, ancak yine de bir dezavantajı var - onlardan sonra başka basamak yoksa bu işlev sıfırları tanımıyor. Örneğin, fonksiyona 0,01 sayısı verilirse 2, 0,0000 ise 0 döndürür (yani dört sıfır görmez). Bu nedenle, geliştirmelerinizde bu eksikliği göz önünde bulundurun.


MQL4'teki kod

 int Digits_values( double value )
  {
   int digits = 0 ;
   string string_value = ( string ) value ;
   int limit = StringLen(string_value);
   for ( int i = 1 ; i < limit; i++)
     {
       if (StringSubstr(string_value,i, 1 ) == "." )
        {
         digits = limit - (i + 1 ); break ;
        };
     };
   //-----------------------------------------------------------------
   return (digits);
  }


MQL5'teki kod

 int Digits_values( double value)
  {
   int digits = 0 ;
   string string_value = ( string )value;
   int limit = StringLen (string_value);
   for ( int i = 1 ; i < limit; i++)
     {
       if ( StringSubstr (string_value,i, 1 ) == "." )
        {
         if (i == limit - 2 )
           {
             if ( StringSubstr (string_value,limit- 2 , 1 ) == "." && StringSubstr (string_value,limit- 1 , 1 ) == "0" )
              {
               break ;
              }
             else
              {
               digits = 1 ; break ;
              };
           }
         else
           {
            digits = limit - (i + 1 ); break ;
           };
        };
     };
   //-----------------------------------------------------------------
   return (digits);
  }

MQL5'teki kodun biraz iyileştirilmesi gerekiyordu, çünkü görünüşe göre MQL5'te çift tipteki değişkenler, kendisine bir tamsayı atanmış olup olmadığına bakılmaksızın sonunda otomatik olarak ,0 atanmıştır. Ve bu nedenle fonksiyon asla 0 döndürmedi

 
Alexandr Sokolov :

Ondalık noktadan sonra ondalık basamak sayısını almak gerektiğinde nadir bir durum yaşayan tek ben değilim sanırım ve Digits() işlevi yalnızca tırnak işaretleri ile çalışıyor ve ayrıca bu konuda hiçbir bilgi yok herhangi bir yerde (en azından bu yazıyı daha önce yazarken buldum, bu yüzden hangi çözümü bulduğumu göstermek istiyorum)?

Görünüşe göre, öz çok basit, ancak yine de bir dezavantajı var - onlardan sonra başka basamak yoksa bu işlev sıfırları tanımıyor. Örneğin, fonksiyona 0,01 sayısı verilirse 2, 0,0000 ise 0 döndürür (yani dört sıfır görmez). Bu nedenle, geliştirmelerinizde bu eksikliği göz önünde bulundurun.

MQL5'teki kodun biraz iyileştirilmesi gerekiyordu, çünkü görünüşe göre MQL5'te çift tipteki değişkenler, kendisine bir tamsayı atanmış olup olmadığına bakılmaksızın sonunda otomatik olarak ,0 atanmıştır. Ve bu nedenle fonksiyon asla 0 döndürmedi

2.4875 sayısını verdiğimizi varsayalım, fonksiyon 4 döndürür.

Ve bundan sonra ne yapmalı? Anlamadığım bir şey

 
Alexandr Sokolov :

Ondalık noktadan sonra ondalık basamak sayısını almak gerektiğinde nadir bir durum yaşayan tek ben değilim sanırım ve Digits() işlevi yalnızca tırnak işaretleri ile çalışıyor ve ayrıca bu konuda hiçbir bilgi yok herhangi bir yerde (en azından bu yazıyı daha önce yazarken buldum, bu yüzden hangi çözümü bulduğumu göstermek istiyorum)?


Görünüşe göre, öz çok basit, ancak yine de bir dezavantajı var - onlardan sonra başka basamak yoksa bu işlev sıfırları tanımıyor. Örneğin, fonksiyona 0,01 sayısı verilirse 2, 0,0000 ise 0 döndürür (yani dört sıfır görmez). Bu nedenle, geliştirmelerinizde bu eksikliği göz önünde bulundurun.


MQL4'teki kod


MQL5'teki kod

MQL5'teki kodun biraz iyileştirilmesi gerekiyordu, çünkü görünüşe göre MQL5'te double türündeki değişkenler, kendisine bir tamsayı atanıp atanmadığına bakılmaksızın, sonunda otomatik olarak ,0 atanır. Ve bu nedenle fonksiyon asla 0 döndürmedi

sonrasında
 string string_value = ( string ) value ;

daha fazla okumak yok :-)

 
Vitaly Muzichenko :

2.4875 sayısını verdiğimizi varsayalım, fonksiyon 4 döndürür.

Ve bundan sonra ne yapmalı? Anlamadığım bir şey

Kimin neye ihtiyacı olduğuna bağlı. Örneğin, korelasyon indeksini hesaplamayı kolaylaştırmak için tam sayılara ihtiyacım vardı.

 
Maxim Kuznetsov :

daha fazla okumak yok :-)

Bir programcı için net olmayan nedir?))

 
Bir şey olursa , bir StringFind() işlevi vardır, arama yapmak için karakterler arasında dolaşmanıza gerek yoktur.
 
Dmitry Fedoseev :
Bir şey olursa , bir StringFind() işlevi vardır, arama yapmak için karakterler arasında dolaşmanıza gerek yoktur.

Teşekkür ederim

 

sökük

 int GetDigits( double Price )
{
   int Res = 0 ;

   while (( bool )(Price = :: NormalizeDouble (Price - ( int )Price, 8 )) && (Res < 8 ))
  {
    Price *= 10 ;

    Res++;
  }

   return (Res);
}
 
fxsaber :
sökük

ayrıca iyi bir çözüm

 
Alexandr Sokolov :

ayrıca iyi bir çözüm

İyi bir çözüm genellikle doğru şekilde çalışır

 void OnStart ()
{
         double price = 500000000.0001 ;
         Print ( price, ":" , GetDigits( price ));
}

Sonuç: 500000000.0001:8

Ondalık noktadan sonra kaç basamak var? gerçekten 8 mi?

 
A100 :

İyi bir çözüm genellikle doğru şekilde çalışır

Sonuç: 500000000.0001:8

Ondalık noktadan sonra kaç basamak var? gerçekten 8 mi?

Evet, sekiz.

Neden: