正確な」値を得ることは可能でしょうか? - ページ 3

 
abolk:
関数を確認したところ、0.02を残していました。

私の切り口は正しいのでしょうか?

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:
abolkの 例から0.01を取るには、どのように関数を最適化すればよいのでしょうか?

どの機能のことを指しているのでしょうか?

文字列またはNLを最初に通過する?

 
sanyooooook:

そして、それを正しくカットしている私の状態はどうなっているのでしょうか?

私の条件を飲んで、切らないでください。

廃止する
0.019999999999の取り方 -- 0.01の残し方
 
abolk:

私の条件を飲んで、切らないでください。

8桁しかないので、コンパイラは0.019999999999を0.02に正規化 するようです。

ということで、入力は0.02となります。

 
   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));

与える

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
 

)))さん、ごめんなさい。

ドゥーブルは有効数字が15桁で、それ以上の数字が入ることになります。

 
sanyooooook:

)))さん、ごめんなさい。

ドゥーブルは有効数字が15桁で、それ以上の数字が入ります。

さて、ようやく -- この問題についての建設的な議論が行われるようになりました。
 
sanyooooook:

)))さん、ごめんなさい。

dbleは有効数字が15桁で、これからもっと増えるんですね。

これが私の解決策です。

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

を与える=0.01

を追加し、9を追加すると

double d=0.019999999999999999;
double e=(int)(d*100)/100.0;
Print("e=",e);
は、=0.02です。
 
abolk:
さて、ようやく -- この問題についての建設的な議論が行われるようになりました。
なぜ、これが必要なのか。データオーバーフロー。
 
abolk:

これが私の解決策です。

d*100

この操作により、数値が歪むことがあります