MQL4およびMQL5でDigits()をバイパスして任意の数値(引用符だけでなく)の小数点以下桁数を取得

 

小数点以下の桁数を取得する必要があり、Digits()関数が 引用符でしか動作せず、しかもどこにも情報がない(少なくともこの記事を書いている時点では、今まで見つけられなかったので、どんな解決策があるかを紹介したい)という珍しい状況に陥ったのは、私だけではないと思うんです。


それは、判明したように、平凡な単純な本質が、まだ1つの欠点を持っている - それらの後に他の数字がない場合、この関数は、ゼロを認識しません。例えば、この関数は0.01が続くと2を返しますが、0.0000が続くと0を返します(つまり、4つのゼロを見ることができないのです)。だから、この欠点を考慮して開発を進めてください。


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ではdouble型の変数は整数であろうとなかろうと、最後に自動的に0が代入されるらしいので、このコードを少し改良する必要があった。このため、この関数が0を返したことはない

 
Alexandr Sokolov:

小数点以下の桁数を取得する必要があり、Digits()関数が 引用符でしか動作せず、しかもどこにも情報がない(少なくともこの記事を書いている時点では以前見つけたので、どんな解決策があるかを紹介したい)という珍しい状況に陥ったのは私だけではないと思うのですが、いかがでしょうか。

この機能は、ゼロの後に他の数字がない場合、ゼロを認識しないのだ。例えば、この関数は0.01が続くと2を返しますが、0.0000が続くと0を返します(つまり、4つのゼロを見ることができないということです)。したがって、この欠点を考慮して開発する必要があります。

MQL5では、double型の変数には、整数が代入されていてもいなくても、最後に自動的に0が代入されるらしいので、このコードを少し改良する必要がありました。このため、この関数が0を返したことはない。

例えば、2.4875という数字を与えると、この関数は4を返すとします。

どうすればいいのでしょうか?なんか意味不明(

 
Alexandr Sokolov:

小数点以下の桁数を取得する必要があり、Digits()関数が 引用符でしか動作せず、しかもどこにも情報がない、という珍しい状況に陥ったのは私だけではないでしょう(少なくともこの記事を書いている時点では以前見つけたので、どんな解決策があったかを紹介したいと思います)。


この機能は、ゼロの後に他の数字がない場合、ゼロを認識しないのだ。例えば、この関数は0.01が続くと2を返しますが、0.0000が続くと0を返します(つまり、4つのゼロを見ることができないのです)。だから、この欠点を考慮して開発を進めてください。


MQL4でのコード


MQL5でのコード

MQL5ではdouble型の変数は整数であろうとなかろうと、最後に自動的に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

小数点以下は何桁ですか?本当に8個?

はい、8つです。

理由: