Ist es möglich, einen "genauen" Wert zu erhalten? - Seite 2

 

aber dieser Wert

0.099999999

wird 0,1 zurückgegeben

)

 

dann wäre das oben Zitierte besser für die Aufgabe des TC geeignet:

void OnStart()
  {
//---
   int DIGITS=2;
   string stroka=DoubleToString(0.099999999,8);
   int P=StringFind(stroka,".");
   Print(stroka);
   stroka=StringSubstr(stroka,0,P+DIGITS+1);
   Print(StringToDouble(stroka));
   Print(NL(DIGITS,0.099999999));
   
  }
//+------------------------------------------------------------------+
double NL (int DIGITS,double value) {
   double step=1/MathPow(10,DIGITS);
   return (MathFloor(value/step)*step);
}

Rückgabe:

2014.10.04 11:42:31.856 normalize EURUSD,H4: 0.09
2014.10.04 11:42:31.856 normalize EURUSD,H4: 0.1
2014.10.04 11:42:31.856 normalize EURUSD,H4: 0.10000000
 

Ich habe eine Funktion skizziert, die genau das tut, was ich will: Sie schneidet eine Zeichenkette im Gegensatz zu DoubleToStr genau auf die angegebene Genauigkeit ab:

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 : ""));
}

Ergebnis für "0.09864724":

Comment (Normalize (0.09864724, 2)); // 0.09

Ergebnis für"0,-843158":

Comment (Normalize ("0,-843158", 3, ",-")); // 0,-843

Operationen mit Double und ähnlichem:

Comment ((double) Normalize (0.09, 2) * 5); // 0.45

Ich habe nachgeforscht und eine solche Funktion existiert bereits in MQL4 (5?). Wenn sie nicht vorhanden ist, warum wurde sie dann nicht schon vor langer Zeit hinzugefügt? :)

 
WePlexus:

Ich habe eine Funktion skizziert, die genau das tut, was ich will: Sie schneidet eine Zeichenkette im Gegensatz zu DoubleToStr genau auf die angegebene Genauigkeit ab:

Ergebnis für "0.09864724":

Ergebnis für"0,-843158":

Operationen mit Double und ähnlichem:

Ich habe nachgeforscht und eine solche Funktion existiert bereits in MQL4 (5?). Wenn sie nicht vorhanden ist, warum wurde sie nicht schon vor langer Zeit hinzugefügt? :)

das nenne ich "einfacher" )
 
WePlexus:

Ich habe eine Funktion skizziert, die genau das tut, was ich will: Sie schneidet eine Zeichenkette im Gegensatz zu DoubleToStr genau auf die angegebene Genauigkeit ab:

Ergebnis für "0.09864724":

Ergebnis für"0,-843158":

Operationen mit Double und ähnlichem:

Ich habe nachgeforscht und eine solche Funktion existiert bereits in MQL4 (5?). Wenn sie nicht vorhanden ist, warum wurde sie dann nicht schon vor langer Zeit hinzugefügt? :)

Sie arbeiten mit merkwürdigen Beispielen - deshalb ist es unmöglich, daraus zu schließen, dass Ihre Funktion korrekt funktioniert.

Nehmen wir dieses Beispiel:

wie zu verlassen =0.01999999999999999999 -- verlassen =0.01
 
abolk:
Sie arbeiten mit Beispielen, die nicht aus dem Zusammenhang gerissen sind - daher können Sie nicht davon ausgehen, dass Ihre Funktion korrekt funktioniert.

Nehmen wir dieses Beispiel:

wie zu verlassen =0.01999999999999999999 -- verlassen =0.01
die letzte Funktion überprüft, bleibt 0,01.
 

Ich verstehe immer noch nicht, was Sie wollen.

Wenn Sie 0,098 statt 0,098 auf dem Diagramm sehen wollen, dann tun Sie das!

int a=0,098 * 100;

double d=a/100.0;

Kommentar(StringFormat("%G", d );

 
sanyooooook:
die letzte Funktion überprüft, bleibt 0,01
Ich habe Ihre Funktion überprüft - es bleibt 0,02
 
abolk:
Ich habe Ihre Funktion überprüft - es bleibt 0,02.

In der Tat, 0,02.

Meine Funktion ist vielleicht etwas umständlicher, aber sie schneidet genau 0,01 ab.

 
sanyooooook:
die letzte Funktion überprüft, bleibt 0,01
Wie kann Ihre Funktion optimiert werden, um 0,01 aus demabolk-Beispiel zu nehmen?