I think it's because of how the double floating-point numbers are stored in operating systems
maybe it can be hacked that way:
double dRnd10th = MathRound(dD10th * 10.0) / 10.0;
I see 4.1 though if I use NormalizeDouble with Print
double num = 4.0999999999; double dD10th = NormalizeDouble(num, 1); Print("TEST: ", dD10th);
I have no idea why the statement "double dD10th = 4.1;" would result in the value "4.0999999999999996", but oh well. So I'm trying to round it back to what I originally assigned it, "4.1".
I tried "double dRnd10th = NormalizeDouble(dD10th,1);" but that did nothing:
Not sure why 4.1 <> 4.1 (or 4.01 <> 4.01) and not sure what to do about it.
And why would NormalizeDouble work with d100th but not d10th?
What am I missing?
Study this carefully and the questions will disappear:
https://en.wikipedia.org/wiki/IEEE_754
https://en.wikipedia.org/wiki/Double-precision_floating-point_format
You can also play with this calculator to understand this standard:
Thanks everyone. What I'm taking away from this is that yeah, it's just a fact of digital life and, no, I don't need to worry about it.
https://www.mql5.com/en/forum/440534
Print((string)double_value);
![Bug in MetaEditor Build 3566: Wrong display of double floating point numbers in the debugger window - Double floating point numbers in Dialog boxes and output of FileWrite Functions. Bug in MetaEditor Build 3566: Wrong display of double floating point numbers in the debugger window - Double floating point numbers in Dialog boxes and output of FileWrite Functions.](https://c.mql5.com/36/82/bug-in-metaeditor-build-3566-wrong.jpg)
- 2023.01.26
- amrali
- www.mql5.com
You used NormalizeDouble, Its use is usually wrong, as it is in your case.
-
Floating point has an infinite number of decimals, it's you were not understanding floating point and that some numbers can't be represented exactly. (like 1/10.)
Double-precision floating-point format - Wikipedia, the free encyclopediaSee also The == operand. - MQL4 programming forum (2013)
-
Print out your values to the precision you want with DoubleToString - Conversion Functions - MQL4 Reference.
-
SL/TP (stops) need to be normalized to tick size (not Point) — code fails on non-currencies.
On 5Digit Broker Stops are only allowed to be placed on full pip values. How to find out in mql? - MQL4 programming forum #10 (2011)And abide by the limits Requirements and Limitations in Making Trades - Appendixes - MQL4 Tutorial and that requires understanding floating point equality Can price != price ? - MQL4 programming forum (2012)
-
Open price for pending orders need to be adjusted. On Currencies, Point == TickSize, so you will get the same answer, but it won't work on non-currencies. So do it right.
Trailing Bar Entry EA - MQL4 programming forum (2013)
Bid/Ask: (No Need) to use NormalizeDouble in OrderSend - MQL4 programming forum (2012) -
Lot size must also be adjusted to a multiple of LotStep and check against min and max. If that is not a power of 1/10 then NormalizeDouble is wrong. Do it right.
(MT4 2013)) (MT5 2022)) -
MathRound() and NormalizeDouble() are rounding in a different way. Make it explicit.
MT4:NormalizeDouble - MQL5 programming forum (2017)
How to Normalize - Expert Advisors and Automated Trading - MQL5 programming forum (2017) -
Prices you get from the terminal are already correct (normalized).
-
PIP, Point, or Tick are all different in general.
What is a TICK? - MQL4 programming forum (2014)
![MQL5 - Language of trade strategies built-in the MetaTrader 5 client terminal](https://c.mql5.com/i/registerlandings/logo-2.png)
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
I have no idea why the statement "double dD10th = 4.1;" would result in the value "4.0999999999999996", but oh well. So I'm trying to round it back to what I originally assigned it, "4.1".
I tried "double dRnd10th = NormalizeDouble(dD10th,1);" but that did nothing:
Not sure why 4.1 <> 4.1 (or 4.01 <> 4.01) and not sure what to do about it.
And why would NormalizeDouble work with d100th but not d10th?
What am I missing?