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

 
Igor Makanu:

いいえ、うまくいきません...。

そうだった、ロット正規化で使うので、0より小さい数字には承知の上で作っていたのを忘れていた。修正しました、これで大丈夫です。

#define  EPSILON   0.000000001
#define  MORE(A,B) ((A)-(B)>EPSILON)

int Digit(double value)
  {
   int digits=0;
   value=MathMod(value,1.0);
   while(MORE(1.0/MathPow(10,digits),value)) 
      digits++;
   return(digits);
  }
//+------------------------------------------------------------------+
int DoubleToDigits(double value)
 {
   double absvalue=NormalizeDouble(fabs(value-int(value)),15);
   int res=StringLen(string(absvalue))-2;
   return(res<=0?0:res);
 }
//+------------------------------------------------------------------+
void OnStart()
  {
   double f = 122334550.007;
   Print("1. DoubleToDigits() = ",DoubleToDigits(f));
   Print("1. Digit() = ",Digit(f));
   f = 0.007;
   Print("2. DoubleToDigits() = ",DoubleToDigits(f));
   Print("2. Digit() = ",Digit(f));
  }  

結果

2018.11.13 05:18:40.599 Digits (EURUSD,M1)      1. DoubleToDigits() = 11
2018.11.13 05:18:40.599 Digits (EURUSD,M1)      1. Digit() = 3
2018.11.13 05:18:40.599 Digits (EURUSD,M1)      2. DoubleToDigits() = 3
2018.11.13 05:18:40.599 Digits (EURUSD,M1)      2. Digit() = 3
 
FXで稼いだお金をジョリートレーダーバーで運用します。ロンドンで開こう
 
Konstantin Gruzdev:

そうだった、ロット正規化で使うので、0より小さい数字には承知の上で作っていたのを忘れていた。修正しました、これで大丈夫です。

結果

ダメでした。

double f = 122334550.00999;

結果

2018.11.13 02:36:31.034 tst (EURUSD,M30) 1.デジット() = 3


 
主よ、この人たちの子供たちに物理を学ぶ機会をお与えください。
 
Igor Makanu:

いや、うまくいかなかった。

そうか、何が悪いかわかったから、直そう。

 
Алексей Тарабанов:
主よ、この人たちの子供たちに物理を学ぶ機会をお与えください。

親はなくても困らないのに、なぜ?

 

まず、自分自身に答えてください。なぜ、小数点の後の桁数を知る必要が あるのでしょうか?何のために?

2桁で2倍」の正しい使い方は、解くべき問題の中であらかじめ分かって いる、ある一定の 精度で使うことです。

それ以外はナンセンスです。

double moduloの値が大きくなればなるほど精度が落ち、どんなアルゴリズムでも(特に文字列変換では圏外)台無しになるという話でもない。

 
Mesaoria:

(特に文字列に変換するとアウト)は失敗します。

C++では文字列の扱いが遅く、MQLでは組み込み関数が自作関数より速いことは明らかです。

 
Igor Makanu:

これはMQL用のコードで、標準C++用のコードではありません。C++では文字列の処理が遅くなるのは明らかで、MQLでは組み込み関数は自作関数より速いです。

そういう意味じゃないんです。ダブリを文字列に変換して、その中の全文字を計算するという発想は、ただの戯言です。何をするにしても

 
Mesaoria:

そういうことでは全然ないんです。デュブルを文字列に変換して、その文字列の中の文字を数えるという発想は完全にナンセンスです。何をやってもダメ。

そうですね、私のバージョンはおそらくベストではありませんが、それについて何も見つからなかったので、私が自分で考えたベストです、上のコメントで書きましたが、あなたは自分のバージョンを提案しませんでしたね。