"Tam" değeri elde etmek mümkün mü? - sayfa 2

 

ve işte anlamı

0.099999999

0.1 döndürür

)

 

o zaman yukarıda verilenler TS'nin görevi için daha doğru olacaktır:

 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);
}

İadeler:

 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
 

Tam olarak gerekli olanı yapan bir fonksiyon çizdim: DoubleToStr'den farklı olarak bir diziyi tam olarak belirtilen hassasiyette kesiyor:

 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" için sonuç:

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

"0,-843158" için sonuç:

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

Double ve benzeri işlemler:

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

Az önce aradım ve MQL4'te (5?) zaten böyle bir işlev var. Eğer orada değilse, neden uzun zaman önce eklemiyorsunuz? :)

 
WePlexus :

Tam olarak gerekli olanı yapan bir fonksiyon çizdim: DoubleToStr'den farklı olarak bir diziyi tam olarak belirtilen hassasiyette kesiyor:

"0.09864724" için sonuç:

"0,-843158" için sonuç:

Double ve benzeri işlemler:

Az önce aradım ve MQL4'te (5?) zaten böyle bir işlev var. Eğer orada değilse, neden uzun zaman önce eklemiyorsunuz? :)

Anladığım bu, "daha kolay")
 
WePlexus :

Tam olarak gerekli olanı yapan bir fonksiyon çizdim: DoubleToStr'den farklı olarak bir diziyi tam olarak belirtilen hassasiyette kesiyor:

"0.09864724" için sonuç:

"0,-843158" için sonuç:

Double ve benzeri işlemler:

Az önce aradım ve MQL4'te (5?) zaten böyle bir işlev var. Eğer orada değilse, neden uzun zaman önce eklemiyorsunuz? :)

oldukça tipik olmayan örnekler üzerinde çalışıyorsunuz - bu nedenle işlevinizin doğru çalıştığı sonucuna varamazsınız.

bu örneği alın:

=0.01999999999999999999 sayısından itibaren -- =0.01 bırak
 
abolk :
oldukça tipik olmayan örnekler üzerinde çalışıyorsunuz - bu nedenle işlevinizin doğru çalıştığı sonucuna varamazsınız.

bu örneği alın:

=0.01999999999999999999 sayısından itibaren -- =0.01 bırak
son işlevi kontrol etti, 0.01 bırakır
 

Hala ne istediğini anlamıyorum.

Grafikte 0.098 yerine 0.09 görmek istiyorsanız, yapın!

int a=0.098 * 100;

çift d=a/100.0;

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

 
sanyooooook :
son işlevi kontrol etti, 0.01 bırakır
işlevinizi kontrol etti -- 0.02 bırakır
 
abolk :
işlevinizi kontrol etti -- 0.02 bırakır

Gerçekten, 0.02.

Benim işlevim, belki daha hantal ama tam olarak 0,01 kesiyor.

 
sanyooooook :
son işlevi kontrol etti, 0.01 bırakır
İşlevinizi, abolk örneğinden 0.01 alacak şekilde nasıl optimize edebilirsiniz?