绕过MQL4和MQL5中的Digits(),获取任何数字的小数位数(不仅仅是引号)。 - 页 13

 
Dmitry Fedoseev:

这个:F/=0.0000001;是值得怀疑的。

我同意,测试器中的数十亿可能会出现故障,否则就没问题 )

 

12'345'678'987.9991-1

12'345'678'987.9991-2

 

而这是两倍的速度,同样的结果

int dtd2(double f)
 {
  long l=long(f/0.0000001);
  int d = 0, i = 10000000;
 
  while( d < 7 && l % i > 0 )
   {
    i /= 10;
    d ++ ;
   }

  return d ;
 }
 
Ilya Malev:

而这是两倍的速度,同样的结果

这不是你在这里需要的速度,它在inite中或通过GUI事件完成一次。这里最主要的是操作的正确性。如果一个小数被分割,而小数部分 被丢弃,工作的正确性将从何而来?也许它在某种程度上奇迹般地正常工作,但你需要一个令人信服的测试。

 
Dmitry Fedoseev:

这里需要的不是速度,是在inite中或由GUI事件完成一次。这里最主要的是操作的正确性。如果它是在划分小数点并丢弃小数部分,怎么能正确工作?也许它在某种程度上奇迹般地正常工作,但你需要一个令人信服的测试。

好吧,如果你发现了错误(除了像1kkk+这样的数值),我将感谢你的提示。

 
Ilya Malev:

好吧,如果你发现了bug(除了像1kkk+这样的数值),我将感谢你的提示。

我也不会去找它们,因为我不打算使用它们。只是好奇,你怎么会有这么大的信心,认为一切都会是正确的?

 
Dmitry Fedoseev:

我也不会去找它,因为我不打算使用它。我只是想知道,你怎么能如此肯定一切都会正确?

我检查了随机引号和任意数字,如0.7,0.07,50000000.9991等,此外我还做了比较速度测试。我只是要使用这个功能,但不是一次性的,而是更经常地使用。但一般来说,如果你不拿着手鼓跳舞,通常的Digits 就很足够了......

 

找到一个数字:99999999.9999 - dtd2()返回7,我的是4。但这是小事一桩。总而言之,这个功能很好,我终于明白了。

 
Dmitry Fedoseev:

找到一个数字:99999999.9999 - dtd2()返回7,我的是4。但这是小事一桩。总而言之,这个功能很好,我终于理解了它。

嗯,这就是我说的,我自己在上面给出了几个这样的数字。

 
#property strict

#define  test(M,EX) {uint mss=GetTickCount();int nn=(int)pow(10,M);for(int tst=0;tst<nn;tst++){EX;}printf("loops=%i ms=%u",nn,GetTickCount()-mss);}

int d(double x){
   int n;
   for(n=0;n<8;n++){
      if(x==NormalizeDouble(x,n)){
         return(n);
      }
   }
   return(n-1);
}

int dtd2(double f)
 {
  long l=long(f/0.0000001);
  int d = 0, i = 10000000;
 
  while( d < 7 && l % i > 0 )
   {
    i /= 10;
    d ++ ;
   }

  return d ;
 }
 
int dtd3(double f)
 {
  long l=long(f/0.0000001);
 
  if(l%10==0)
  if(l%100==0)
  if(l%1000==0)
  if(l%10000==0)
  if(l%100000==0)
  if(l%1000000==0)
  if(l%10000000==0)
    return 0; else
    return 1; else
    return 2; else
    return 3; else
    return 4; else
    return 5; else
    return 6; else
    return 7;
 }

void OnStart()
 {
  srand(GetTickCount());
  Print("d:");
  test(7,int k=rand()%Bars;double f=Close[k]*rand()/(rand()+1.0);d(f))
  Print("dtd2:");
  test(7,int k=rand()%Bars;double f=Close[k]*rand()/(rand()+1.0);dtd2(f))
  Print("dtd3:");
  test(7,int k=rand()%Bars;double f=Close[k]*rand()/(rand()+1.0);dtd3(f))
 }  

测试