Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   NormalizeDouble nicht wirklich (http://www.expert-advisor.com/forum/showthread.php?t=6093)

freitag 18.04.18 22:41

NormalizeDouble nicht wirklich
 
Hin und wieder berechnet mein NormalizeDouble-Befehl falsch.

Beispiel:
y=NormalizeDouble(x,2);
- da kommt dann ein Wert wie 95.400000000000000001

Kennt dieses Problem noch jemand und weiß einen Rat dafür?

traderdoc 18.04.18 22:57

Zitat:

Zitat von freitag (Beitrag 40928)
Hin und wieder berechnet mein NormalizeDouble-Befehl falsch.

Beispiel:
y=NormalizeDouble(x,2);
- da kommt dann ein Wert wie 95.400000000000000001

Kennt dieses Problem noch jemand und weiß einen Rat dafür?

Mittels Print(DoubleToStr(y, 2)); wird dann nur ausgegeben:

95,4

traderdoc

freitag 19.04.18 14:56

Zitat:

Zitat von traderdoc (Beitrag 40929)
Mittels Print(DoubleToStr(y, 2)); wird dann nur ausgegeben:

95,4

traderdoc


Ich muss den Wert in eine String bringen und mehere davon dann zu einer Kette aneinanderreihen, bevor ich sie anzeigen lasse. Darum geht das, glaube ich, nicht.

Ca$hDigger 19.04.18 17:07

Zitat:

Zitat von freitag (Beitrag 40928)
Hin und wieder berechnet mein NormalizeDouble-Befehl falsch.

Beispiel:
y=NormalizeDouble(x,2);
- da kommt dann ein Wert wie 95.400000000000000001

Kennt dieses Problem noch jemand und weiß einen Rat dafür?

Das ist kein Fehler sondern völlig normal. Der Umgang mit Fließkommazahlen in einer Programmiersprache hat mit Zahlen im "normalen" Leben nur wenig zu tun. Eine Fließkommazahl wird aus einer Mantisse und einem Exponenten dargestellt.
Siehe: https://de.wikipedia.org/wiki/Gleitkommazahl

traderdoc 19.04.18 18:04

Zitat:

Zitat von Ca$hDigger (Beitrag 40934)
Das ist kein Fehler sondern völlig normal. Der Umgang mit Fließkommazahlen in einer Programmiersprache hat mit Zahlen im "normalen" Leben nur wenig zu tun. Eine Fließkommazahl wird aus einer Mantisse und einem Exponenten dargestellt.
Siehe: https://de.wikipedia.org/wiki/Gleitkommazahl


Na ja, ich denke hier hätte MetaQuotes etwas sorgsamer proggen müssen, denn diese kleine Fehlerchen können gravierende Fehler nach sich ziehen.
Bis zu der Stelle, wo die Fließkommazahl letztendlich errechnet wird, gebe ich Dir recht. Aber wenn per NormalizeDouble die Fließkommazahl z.B. auf 2 oder mehreren Stellen reduziert werden soll, dann kann das Ergebnis nicht 95.400000000000000001 lauten. Regelmäßige Fehler treten ja auf, wenn Fließkommazahlen als Price in OrderSend() angegeben werden, ohne! vorher NormalizeDouble verwendet zu haben, auch wenn man denkt, laut Mathematik, dass z.B. aus einer Division eine Zahl resultiert die dem Price-Format der Funktion OrderSend () entspricht. Erst mit NormalizeDouble(Wert, Digits) würde die Fließkommazahl maximal die Kommastellen haben, die dem Wert von Digit entspricht. Und dann tritt auch nie ein OrderSend-Fehler auf.
Daher denke ich, dass diese krumme Zahl 95.400000000000000001 nach der Anwendung von y=NormalizeDouble(x,2); als 95,4 vorliegt, nur durch die Anzeigefunktionen Alert() oder Print() werden solche krummen Zahlen angezeigt. Abhilfe schaft hier wiederum die bereits erwähnte Funktion DoubleToStr(Wert, 2).

traderdoc

Ca$hDigger 19.04.18 21:44

Unmittelbar nach NormalizeDouble sollte für die interne Verarbeitung der Wert schon passen aber sobald damit nur eine Sache gemacht wird treten diese "normalen" Ungenauigkeiten auf.

In der Doku steht ja auch "Please note that when output to Journal using the Print() function, a normalized number may contain a greater number of decimal places than you expect."

Insofern ist das mit dem Print tatsächlich ein unnötiger Effekt auch wenn der Wert intern eigentlich stimmen würde. Daher der Weg über DoubleToStr ist dann für die Darstellung prima.

C$D

traderdoc 19.04.18 22:43

Zitat:

Zitat von Ca$hDigger (Beitrag 40936)
Unmittelbar nach NormalizeDouble sollte für die interne Verarbeitung der Wert schon passen aber sobald damit nur eine Sache gemacht wird treten diese "normalen" Ungenauigkeiten auf.

In der Doku steht ja auch "Please note that when output to Journal using the Print() function, a normalized number may contain a greater number of decimal places than you expect."

Insofern ist das mit dem Print tatsächlich ein unnötiger Effekt auch wenn der Wert intern eigentlich stimmen würde. Daher der Weg über DoubleToStr ist dann für die Darstellung prima.

C$D

Ja, das Entscheidende hatte ich doch gerade vorher geschrieben!

traderdoc

freitag 20.04.18 08:51

Danke für Eure interessante Diskussion.
Damit hab ichs verstanden:

DoubleToStr(x, 2) wir mein Leben bereichern! :)

traderdoc 20.04.18 10:15

Immer wieder schön zu sehen, wie man mit Kleinigkeiten Glückseeligkeit bereiten kann.

traderdoc


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:04 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum