Download MetaTrader 5

Storing 0.07 as a double - impossible???

To add comments, please log in or register
Do you want to order an application? Find out how to obtain the desired result
Paul B
175
Paul B 2014.09.21 20:36 

Is it just me, or can 0.07 not be stored accurately?

 

 Example

double number=0.07;
Comment(number);

 

This displays as 0.07000000000000001, therefore I can for instance send an order using a lot size of 0.07.


SYED NAUFAL GADDAFI
1401
SYED NAUFAL GADDAFI 2014.09.22 00:35  

Well, you can try ...

Comment(NormalizeDouble(number,2));
Paul B
175
Paul B 2014.09.22 08:12  

First thing I tried. Doesn't help at all.

 

I've even wrote my own normalise function that didn't help either.

 

This makes the following command impossible, even though it's perfectly valid

OrderSend(Symbol(),OP_BUY,0.07,Ask,3,0,0,NULL,0,0,CLR_NONE);
SYED NAUFAL GADDAFI
1401
SYED NAUFAL GADDAFI 2014.09.22 08:47  
double number=0.07;

OrderSend(Symbol(),OP_BUY,number,Ask,3,0,0,NULL,0,0,CLR_NONE);
It works for me.
honest_knave
Moderator
2159
honest_knave 2014.09.22 09:27  
Paul_B:

First thing I tried. Doesn't help at all.

 

I've even wrote my own normalise function that didn't help either.

 

This makes the following command impossible, even though it's perfectly valid

 

What is minlot and lotstep for your broker?

https://docs.mql4.com/constants/environment_state/marketinfoconstants 

Keith Watford
Moderator
9603
Keith Watford 2014.09.22 09:39  
Paul_B:

First thing I tried. Doesn't help at all.

 

I've even wrote my own normalise function that didn't help either.

 

This makes the following command impossible, even though it's perfectly valid

 

OrderSend(Symbol(),OP_BUY,0.07,Ask,3,0,0,NULL,0,0,CLR_NONE);

The OrderSend will work perfectly fine with the constant 0.07, it is only when it is calculated that there might be a problem

ie

double a=1.4;
double b=2.0;
double lotsize =a/b;
OrderSend(Symbol(),OP_BUY,lotsize,Ask,3,0,0,NULL,0,0,CLR_NONE);

 May or may not work as intended

whroeder1
14470
whroeder1 2014.09.22 12:51  
Paul_B: Is it just me, or can 0.07 not be stored accurately?
  1. Correct, it can not be stored accurately - because 1/10 is not a multiple of powers of two. 1/8 can be. See http://en.wikipedia.org/wiki/Single-precision_floating-point_format (Ex 2: Consider a value 0.25)
  2. Do NOT use NormalizeDouble, EVER. For ANY Reason. It's a kludge, don't use it. It's use is always wrong. Wrong as given here:
    deysmacro: Well, you can try ...
    Comment(NormalizeDouble(number,2));
    Taking a double, normalizing it to 2 digits, give you a double - same problem - does nothing.
  3. Comment(DoubleToString(number,2));

SYED NAUFAL GADDAFI
1401
SYED NAUFAL GADDAFI 2014.09.22 13:34  
WHRoeder:
  1. Do NOT use NormalizeDouble, EVER. For ANY Reason. It's a kludge, don't use it. It's use is always wrong. Wrong as given here:
    deysmacro: Well, you can try ...
    Taking a double, normalizing it to 2 digits, give you a double - same problem - does nothing


It's not like I don't see that coming long before I post it.



Alain Verleyen
Moderator
30707
Alain Verleyen 2014.09.22 18:02  
deysmacro:


It's not like I don't see that coming long before I post it.



Don't worry, NormalizeDouble works perfectly for what is intended.
To add comments, please log in or register