Нужна помощь с NormalizeDouble! - страница 2

 
Dmitry Fedoseev:

Не, просто она используется в таком месте, где незаметна ее неправильная работа и не важна. Модификация будет где-то на пункт ближе, где-то на пункт дальше - не сильно важно.

Еще, если цена не нормализована, можно получить ошибку 129

похоже вам нечего сказать, не нужно писать такие вещи, если вы не в теме и хотите что то добавить.
пардон, я не собираюсь с вами спорить, берите учебник в руки и читайте.
с уважением.
 
Andrey Kisselyov:
похоже вам нечего сказать, не нужно писать такие вещи, если вы не в теме и хотите что то добавить.
пардон, я не собираюсь с вами спорить, берите учебник в руки и читайте.
с уважением.

да ушшшьь... день удался, поржал на славу, пеши исчо

 
Dmitry Fedoseev:

После этого округления делается умножение.


- первое деление - превращаем дробь в целое число
- округление - отбрасываем лишние знаки
- умножение (в этом случае) изменяет только "порядок" числа, мантисса остается той же (уже округленной)

 
Taras Slobodyanik:

- первое деление - превращаем дробь в целое число
- округление - отбрасываем лишние знаки
- умножение (в этом случае) изменяет только "порядок" числа, мантисса остается той же (уже округленной)


Проверяли? Я тоже когда-то в это верил. Однако эксперименты показали, что хвост появляется при умножении. 

 
Dmitry Fedoseev:

Проверяли? Я тоже когда-то в это верил. Однако эксперименты показали, что хвост появляется при умножении. 


да, действительно, нифига не нормализует %)
а чтож этот whroeder1 в каждом сообщении ссылку эту даёт....

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   
   Print("__0.6=",0.6,"      0.3*2=",0.2*3,"      NormalizePrice=",NormalizePrice(0.6),"      (NormalizePrice(0.2*3)==0.6)? = ", (0.6==NormalizePrice(0.2*3)));

  }
//+------------------------------------------------------------------+


double NormalizePrice(double p, string pair=""){
        // https://forum.mql4.com/43064#515262 zzuegg reports for non-currency DE30:
        // MarketInfo(chart.symbol,MODE_TICKSIZE) returns 0.5
        // MarketInfo(chart.symbol,MODE_DIGITS) return 1
        // Point = 0.1
        // Prices to open must be a multiple of ticksize 
    if (pair == "") pair = Symbol();
    double ts = MarketInfo(pair, MODE_TICKSIZE);
    return( MathRound(p/ts) * ts );
}
 

а еще прикол в том что я умножал несколько раз:

volume=0.2*2;

volume=0.2*3;

volume=0.2*4;

volume=0.2*5;

но хвост появляется только после умножения на 3... это случайность или это как-то можно объяснить?

 
Maksim Neimerik:

но хвост появляется только после умножения на 3... это случайность или это как-то можно объяснить?

число кривое, с хвостом, ничего не поделаешь...

нужно правильно "обходить")

где-то видел хорошую статью с описанием записи чисел в компьютере

 
Maksim Neimerik:

а еще прикол в том что я умножал несколько раз:

volume=0.2*2;

volume=0.2*3;

volume=0.2*4;

volume=0.2*5;

но хвост появляется только после умножения на 3... это случайность или это как-то можно объяснить?

любое число представлено как последовательность 0 и 1 в компе. есть числа целые (integer, long  и так далее) есть дробные (float, double и так далее).  так вот с целыми проблем нет они представлены как последовательность 0 и 1 в прямом порядке. а вот дробные представлены как 1 деленная на то самое дробное и ваша цифра в компе представлена не прямым порядком, а тем, на что нужно разделить 1 чтоб получить ваше число.
получаем то что

volume=0.2*2;   представлено как 1/2,5
volume=0.2*3;   представлено как 1/1.66666666666666666666666666666666666667
volume=0.2*4;   представлено как 1/1,25
volume=0.2*5;   представлено как 1/1.

как видно только одно число не имеет точного знаменателя и как следствие имеет хвост.

 
Andrey Kisselyov:

любое число представлено как последовательность 0 и 1 в компе. есть числа целые (integer, long  и так далее) есть дробные (float, double и так далее).  так вот с целыми проблем нет они представлены как последовательность 0 и 1 в прямом порядке. а вот дробные представлены как 1 деленная на то самое дробное и ваша цифра в компе представлена не прямым порядком, а тем, на что нужно разделить 1 чтоб получить ваше число.
получаем то что

volume=0.2*2;   представлено как 1/2,5
volume=0.2*3;   представлено как 1/1.66666666666666666666666666666666666667
volume=0.2*4;   представлено как 1/1,25
volume=0.2*5;   представлено как 1/1.

как видно только одно число не имеет точного знаменателя и как следствие имеет хвост.

Интересно, а 0.2+0.4=0.600000000000001 ?

Т.е. все дробные числа кратные трём имеют "длинную историю" ?

 
Renat Akhtyamov:

Интересно, а 0.2+0.4=0.600000000000001 ?

Т.е. все дробные числа кратные трём имеют "длинную историю" ?

берете калькулятор, пишите любое дробное число, жмете клавишу (1/Х) и если вы получаете не точное значение, то  у вас будет число с хвостом.

с уважением.
Файлы:
ehe1mz1.PNG  3 kb
vbshoi2.PNG  2 kb
Причина обращения: