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

 

我想我不是唯一一个遇到罕见情况的人,我需要得到小数点后的数字,而Digits()函数 只对引号起作用,此外,在任何地方都没有相关信息(至少在写这篇文章时,我以前没有发现,所以我想展示我找到的解决方案)。


事实证明,平庸的本质是简单的,但仍然有一个缺点 - 这个功能不承认零,如果他们之后没有其他数字。例如,这个函数在0.01后面会返回2,但在0.0000后面会返回0(也就是说,它看不到四个零)。因此,在你的发展中要考虑这个缺点。


MQL4中的代码

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的代码

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的代码必须稍作改进,因为显然在MQL5中,双倍类型的变量在最后会自动分配为0,无论该变量是否为整数。由于这个原因,该函数从未返回过0

 
Alexandr Sokolov:

我想我不是唯一一个遇到罕见情况的人,我需要获得小数位数,而Digits()函数 只对引号起作用,此外在任何地方都没有相关信息(至少在写这篇文章的时候,我之前找到了,所以我想展示我找到的解决方案)。

事实证明,其本质非常简单,但仍有一个缺点--该功能不识别零,如果在它们之后没有其他数字。例如,这个函数在0.01后面会返回2,但在0.0000后面会返回0(这意味着它不能看到四个零)。因此,你应该在你的发展中考虑这个缺点。

MQL5中的代码必须稍作改进,因为显然在MQL5中,双倍类型的变量在最后会自动分配,0,无论该变量是否被分配给一个整数。由于这个原因,该函数从未返回过0。

假设我们给出数字2.4875,函数返回4。

我们应该怎么做呢?我不明白的是(

 
Alexandr Sokolov:

我想我不是唯一一个遇到罕见情况的人,我需要获得小数位数,而Digits()函数 只对引号起作用,此外在任何地方都没有相关信息(至少在写这篇文章的时候,我之前找到了,所以我想展示我找到的解决方案)。


事实证明,其本质非常简单,但仍有一个缺点--该功能不识别零,如果在它们之后没有其他数字。例如,当函数后面是0.01时,将返回2,但当后面是0.0000时,将返回0(即它不能看到四个零)。因此,在你的发展中要考虑这个缺点。


MQL4中的代码


在MQL5的代码

MQL5的代码必须稍作改进,因为显然在MQL5中,双倍类型的变量在最后会自动分配为0,无论该变量是否为整数。由于这个原因,该函数从未返回过0。

之后
string string_value = (string)value;

不要再读下去了 :-)

 
Vitaly Muzichenko:

假设我们给出数字2.4875,该函数将返回4。

我们该怎么做呢?我似乎不明白这一点(

取决于谁需要什么。例如,我需要整数来更容易地计算相关指数

 
Maxim Kuznetsov:

你不需要再读下去了 :-)

这里的程序员有什么不清楚的吗?)

 
如果有的话,有一个StringFind()函数,不需要在字符中循环查找。
 
Dmitry Fedoseev:
如果有的话,有一个StringFind()函数,不需要在字符中循环查找。

谢谢

 

被拉出

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

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

    Res++;
  }

  return(Res);
}
 
fxsaber:
摘自

也是一个好办法

 
Alexandr Sokolov:

也是一个好办法

一个好的解决方案通常能正常工作

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

结果:500000000.0001:8

小数点后有多少个数字?它真的是8吗?

 
A100:

一个好的解决方案通常能正常工作

结果:500000000.0001:8

小数点后有多少个数字?真的是八个吗?

是的,八个。