Rundung von Zahlen in MT4 über NormalizeDouble - Seite 3

 

Mathematik. Klasse 6. Lehrbuch. Nikolsky S.M., Potapov M.K. Moskau: 2012. - 256 с

Rundung.

Rundung

 

Dieses Thema hat sich zu einem wahren Hitzkopf entwickelt. MT4 scheint mit der Rundung korrekt zu arbeiten.
Ich wollte, dassNormalizeDouble(0.055,2) die Zahl"0.055" nicht auf "0.06" rundet, sondern sie auf "0.05" trimmt.

Ich habe Schwierigkeiten, diese MKL-Funktionen zu verstehen. Ich verstehe nicht wirklich, warum "1.0015223567" mit der Funktion NormalizeDouble gerundet werden sollte, wenn alles, was Sie wollen, ist, die BORROWN Zahl an die richtige Stelle zu bringen.
Das heißt, NormalizeDouble(1.001526789, 5) würde "1.00152" ergeben. Er muss nicht auf "
1,00153" gerundet werden. Dafür muss es die Funktion RoundDouble geben =)

Ist das möglich? Oder ist es notwendig, ständig zu runden und die falschen Zahlen zu erhalten?

 

Entscheiden Sie sich lieber gleich. Das ist Rundung:

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Rundung von Zahlen in MT4 über NormalizeDouble

Roman Starinskij, 2016.01.21 10:03

Hallo. Können Sie mir sagen, wo das Problem liegt?

Warum rundet die Funktion NormalizeDouble(0.055,2) die Zahl "0.055" auf "0.06"?

Es handelt sich nicht um eine Rundungsfunktion für Brüche.


Das ist nicht der Fall:

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Rundung von Zahlen in MT4 über NormalizeDouble

Roman Starinskij, 2016.01.25 14:30

Dieses Thema hat sich zu einem wahren Hitzkopf entwickelt. MT4 scheint mit der Rundung korrekt zu arbeiten.
Ich meinteNormalizeDouble(0.055,2) nicht, um die Zahl"0.055" auf "0.06" zu runden, sondern um sie auf "0.05" zu trimmen.

Ich habe Schwierigkeiten, diese MKL-Funktionen zu verstehen. Ich verstehe nicht wirklich, warum "1.0015223567" mit der Funktion NormalizeDouble gerundet werden sollte, wenn alles, was Sie wollen, ist, die DIREKTE Zahl an die richtige Stelle zu bringen.
Das heißt, NormalizeDouble(1.001526789, 5) würde "1.00152" ergeben. Er muss nicht auf "
1,00153" gerundet werden. Dafür muss es die Funktion RoundDouble geben =)

Ist das möglich? Oder ist es notwendig, ständig zu runden und Zahlen zu erhalten, die man nicht haben will?


Und um des Experimentierens willen:

//+------------------------------------------------------------------+
//|                                              NormalizeDouble.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property script_show_inputs
#property description "Проверка NormalizeDouble"
input double   value=0.055;      // нормализуемое число 
input int      digits=2;         // кол-во знаков после запятой 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Print("Число ",value," округлённое с точностью до ",digits," знаков = ",NormalizeDouble(value,digits));
  }
//+------------------------------------------------------------------+
Dateien:
Test.mq5  2 kb
 
Roman Starinskij:

Dieses Thema hat sich zu einem wahren Hitzkopf entwickelt. MT4 scheint mit der Rundung korrekt zu arbeiten.
Ich wollte, dassNormalizeDouble(0.055,2) die Zahl"0.055" nicht auf "0.06" rundet, sondern sie auf "0.05" trimmt.

Ich habe Schwierigkeiten, diese MKL-Funktionen zu verstehen. Ich verstehe nicht wirklich, warum "1.0015223567" Preise mit der Funktion NormalizeDouble gerundet werden sollten, wenn alles, was Sie wollen, ist, die DIREKTE Zahl auf die richtige Stelle zu bringen.
Das heißt, NormalizeDouble(1.001526789, 5) würde "1.00152" ergeben. Er muss nicht auf "
1,00153" gerundet werden. Dafür muss es die Funktion RoundDouble geben =)

Ist das möglich? Oder müssen Sie ständig runden und erhalten Zahlen, die Sie nicht wollen?

Wenn Sie beschneiden müssen, dann beschneiden Sie; wenn Sie abrunden müssen, dann runden Sie ab. Die Funktion NormalkizeDouble() rundet, und das ist das, was Sie am häufigsten brauchen.

Warum denken Sie, dass RoundDouble() anstelle von NormalizeDouble() verwendet werden sollte? Haben Sie diese Welt erschaffen? Ist es in Ordnung, dass eine Kugel rollt und ein Quadrat vier Ecken hat?

 
Roman Starinskij:

Dieses Thema hat sich zu einem wahren Hitzkopf entwickelt.


Das liegt alles daran, dass der Themenstarter die Sprachdokumentation nicht liest und nicht auf das hört, was ihm gesagt wird.
 
Slawa:
Das liegt daran, dass der Autor die Sprachdokumentation nicht liest und nicht auf das hört, was ihm gesagt wird.

Das folgende Verhalten beim Teilen und Runden von Brüchen ist ein wenig unklar.

Es gibt 2 Gleichungen:
0.06-0.02 = 0.03999999999999999
0.06-0.024 = 0.036

Die Verwendung der empfohlenen Funktion NormalizeDouble führt zu diesen Ergebnissen:
0.03999999999999999 = 0.04
0.036 = 0.04

Im ersten Beispiel brauchen wir wirklich den Wert 0,04, aber im zweiten Beispiel brauchen wir 0,03 (so funktioniert ein normaler Taschenrechner).
NormalizeDouble sollte verwendet werden, weil Brüche zurückgegeben werden, die nicht vollständig sind, aber im zweiten Fall gibt die Funktion falsche Werte zurück, und man kann sie auch nicht für das erste Beispiel nicht verwenden.

 
Roman Starinskij:

Das folgende Verhalten beim Teilen und Runden von Brüchen ist ein wenig unklar.

Es gibt zwei Gleichungen:
0.06-0.02 = 0.03999999999999999
0.06-0.024 = 0.036

Die Verwendung der empfohlenen Funktion NormalizeDouble führt zu diesen Ergebnissen:
0.03999999999999999 = 0.04
0.036 = 0.04

Im ersten Beispiel brauchen wir wirklich den Wert 0,04, aber im zweiten Beispiel brauchen wir 0,03 (so funktioniert ein normaler Taschenrechner).
NormalizeDouble sollte verwendet werden, weil Brüche zurückgegeben werden, die nicht vollständig sind, aber im zweiten Fall gibt die Funktion falsche Werte zurück, und man kann sie auch nicht für das erste Beispiel nicht verwenden.

Ihr normaler Taschenrechner rechnet nicht richtig, das sollte er aber:

 
Slawa:
Alles nur, weil der Themenstarter die Sprachdokumentation nicht liest und nicht auf das hört, was ihm gesagt wird.

wenn N+1 Ziffer < 5, dann wird die N-te Ziffer beibehalten und N+1 und alle folgenden Ziffern werden auf Null gesetzt;

wenn N+1 Ziffer ≥ 5 ist, wird die N-te Ziffer um eins erhöht und N+1 und alle folgenden Ziffern werden auf Null gesetzt;

Tut mir leid, aber ich verstehe immer noch nicht, warum die Rundung durch '2' nicht sofort = 0,06000000 ergibt.

void OnStart()
  {

   double v1 = NormalizeDouble(0.055,3);
   double v2 = NormalizeDouble(0.0549,3);

   v1=NormalizeDouble(v1,2);
   v2=NormalizeDouble(v2,2);
   Print("v1 = ",DoubleToString(v1),", v2 = ",DoubleToString(v2));

  }

v1 = 0,06000000, v2 = 0,06000000

void OnStart()
  {

   double v1 = NormalizeDouble(0.055,2);
   double v2 = NormalizeDouble(0.0549,2);

   Print("v1 = ",DoubleToString(v1),", v2 = ",DoubleToString(v2));

  }

v1 = 0,06000000, v2 = 0,05000000

void OnStart()
  {
   for(int i=7;i>=1;i--)
     {
      double v1 = 1.1234567;
      double v2 = NormalizeDouble(v1,i+1);

      v1=NormalizeDouble(v1,i);
      v2=NormalizeDouble(v2,i);
      Print("v1 = ",i," = ",DoubleToString(v1,7),", v2 = ",i," = ",DoubleToString(v2,7));
     }
     Print("---");
  }

---

v1 = 1 = 1.1000000, v2 = 1 = 1.1000000
v1 = 2 = 1.1200000, v2 = 2 = 1.1200000
v1 = 3 = 1.1230000, v2 = 3 = 1.1240000
v1 = 4 = 1,1235000, v2 = 4 = 1,1235000
v1 = 5 = 1,1234600, v2 = 5 = 1,1234600
v1 = 6 = 1,1234570, v2 = 6 = 1,1234570
v1 = 7 = 1,1234567, v2 = 7 = 1,1234567




 
lilita bogachkova:


Es tut mir leid, aber ich verstehe immer noch nicht, warum die Rundung durch '2' es nicht möglich macht, = 0,06000000 zu erhalten.


Weil es 0,6 ist, also kann man 0,5 nur durch Betrug erreichen.
 
lilita bogachkova:

Es tut mir leid, aber ich verstehe immer noch nicht, warum die Rundung durch '2' es unmöglich macht, = 0,06000000 zu erhalten.


Wenn nur eine Ziffer normalisiert wird, ist es einfach: 0, 1, 2, 3, 4 -> 0, und 5, 6, 7, 8, 9 -> 1.

Bei der Normalisierung von zwei Ziffern werden zweistellige Zahlen berücksichtigt: 0 - 49 -> 0 und 50 - 99 -> 1. Wenn die Zahl 1,49 auf ganze Zahlen gerundet werden muss, müssen wir dann wirklich 2 bekommen, was 51 Hundertstel im Vergleich zu den verfügbaren 49 Hundertsteln Abstand zu 1 ist?

Dasselbe gilt für dreistellige, vierstellige usw.

Grund der Beschwerde: