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

 
abolk :
işlevinizi kontrol etti -- 0.02 bırakır

ve beni doğru yapan ne?

 void OnStart ()
  {
//---
   int DIGITS= 2 ;
   string stroka= DoubleToString ( 0.0199999999999 , 8 );
   int P= StringFind (stroka, "." );
   Print (stroka);
   stroka= StringSubstr (stroka, 0 ,P+DIGITS+ 1 );
   Print ( StringToDouble (stroka));
   Print (NL(DIGITS, 0.0199999999999 ));
   Print (Normalize ( 0.0199999999999 , 2 ));
  }
//+------------------------------------------------------------------+
double NL ( int DIGITS, double value) {
   double step= 1 / MathPow ( 10 ,DIGITS);
   return ( MathFloor (value/step)*step);
}
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 : "" ));
}


 2014.10 . 04 11 : 56 : 06.199 normalize EURUSD,H4: 0.01
2014.10 . 04 11 : 56 : 06.199 normalize EURUSD,H4: 0.01
2014.10 . 04 11 : 56 : 06.199 normalize EURUSD,H4: 0.02
2014.10 . 04 11 : 56 : 06.199 normalize EURUSD,H4: 0.02000000
 
WePlexus :
İşlevinizi abolk örneğinden 0.01 alacak şekilde nasıl optimize edebilirsiniz?

hangi işlevi kastediyorsun?

ilk satırdan mı yoksa NL'den mi?

 
sanyooooook :

ve beni doğru yapan ne?

benim durumumu al ve kesme:

iptal :
=0.01999999999999999999 sayısından itibaren -- =0.01 bırak
 
abolk :

benim durumumu al ve kesme:

bu nedenle doble yalnızca 8 karakterdir, burada derleyici 0,01999999999999999999 ila 0,02 sayısını normalleştirir

onlar. 0.02 girişe gider

 
   int DIGITS= 2 ;
   Print ( 0.01999999999999999999 );
   string stroka= DoubleToString ( 0.01999999999999999999 , 8 );
   int P= StringFind (stroka, "." );
   Print (stroka);
   stroka= StringSubstr (stroka, 0 ,P+DIGITS+ 1 );
   Print ( StringToDouble (stroka));
   Print (NL(DIGITS, 0.01999999999999999999 ));
   Print (Normalize ( 0.01999999999999999999 , 2 ));

verir

 2014.10 . 04 12 : 17 : 13.637 normalize EURUSD,H4: 0.02
2014.10 . 04 12 : 17 : 13.637 normalize EURUSD,H4: 0.02
2014.10 . 04 12 : 17 : 13.637 normalize EURUSD,H4: 0.02
2014.10 . 04 12 : 17 : 13.637 normalize EURUSD,H4: 0.02000000
2014.10 . 04 12 : 17 : 13.637 normalize EURUSD,H4: 0.02
 

))), üzgünüm aptal

doble'ın 15 anlamlı basamağı var ve daha fazla girdiniz var

 
sanyooooook :

))), üzgünüm aptal

doble'ın 15 anlamlı basamağı var ve daha fazla girdiniz var

Eh, nihayet - sorunun yapıcı bir tartışması başladı.
 
sanyooooook :

))), üzgünüm aptal

doble'ın 15 anlamlı basamağı var ve daha fazla girdiniz var

işte benim çözümüm:

 double d= 0.01999999999999999 ;
double e=( int )(d* 100 )/ 100.0 ;
Print ( "e=" ,e);

=0.01 verir

ve 9-ku eklerseniz:

 double d= 0.01999999999999999 9 ;
double e=( int )(d* 100 )/ 100.0 ;
Print ( "e=" ,e);
o zaman =0.02 verecek
 
abolk :
Sonunda - sorunun yapıcı bir tartışması gitti
Ve neden buna ihtiyacın var? Veri taşması.
 
abolk :

işte benim çözümüm:

d* 100

Bu işlem sayısal değeri bozabilir