Расчет остатка от деления

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Олег
16
Олег  

Добрый день.

Подскажите, в чем моя ошибка или подвох?

MathMod(200, 1) = 0;   // логично
MathMod(2, 0.01) = 0.01; // нелогично
MathMod(2, NormalizeDouble(0.01, 2)) = 0.01; // то есть все равно неверно

Как же тогда получить правильный результат 0?

Victor Nikolaev
Модератор
13987
Victor Nikolaev  
Sheremetiev писал (а) >>

Добрый день.

Подскажите, в чем моя ошибка или подвох?

Как же тогда получить правильный результат 0?

Вернее всего что в справке не указано что остаток от деления может может при делении целых чисел.

Олег
16
Олег  

Насколько я понимаю, для деления целых чисел есть %.

Понятно, что здесь какие-то проблемы с округлением чисел. Но вопрос остается открытым: как, не зная точности делителя, получить правильный результат?

Victor Nikolaev
Модератор
13987
Victor Nikolaev  
Sheremetiev писал (а) >>

Насколько я понимаю, для деления целых чисел есть %.

Понятно, что здесь какие-то проблемы с округлением чисел. Но вопрос остается открытым: как, не зная точности делителя, получить правильный результат?

Я попробовал и результат такой же.

Олег
16
Олег  

Да вот и я ломаю голову, как добиться округления.

Нужно это для следующего. Необходимо открыть позу с объемом, рассчитанным в процентах от баланса, эквити или свободных средств. Чаще всего результат выходит с огромным количеством точек после запятой. Мне необходимо округлить это значение до ближайшего согласно LOTSTEP. Я делаю так:

Accuracy = A-MathMod(A, LotStep)+LotStep;  // округление к большему
Accuracy = A-MathMod(A, LotStep);  // округление к меньшему
в результате, когда A кратно LotStep я получаю значение LotStep. В принципе, можно просто проверять на равенство этих двух значений. Но, опять же, мне неизвестна точность LotStep, чтобы сравнить два вещественных числа. Ее можно вычислить как значение десятичного логарифма, если LotStep является степенью 10, а что делать в случае, если оно равно 0.2, например?
Victor Nikolaev
Модератор
13987
Victor Nikolaev  
Sheremetiev писал (а) >>

Да вот и я ломаю голову, как добиться округления.

Нужно это для следующего. Необходимо открыть позу с объемом, рассчитанным в процентах от баланса, эквити или свободных средств. Чаще всего результат выходит с огромным количеством точек после запятой. Мне необходимо округлить это значение до ближайшего согласно LOTSTEP. Я делаю так:

в результате, когда A кратно LotStep я получаю значение LotStep. В принципе, можно просто проверять на равенство этих двух значений. Но, опять же, мне неизвестна точность LotStep, чтобы сравнить два вещественных числа. Ее можно вычислить как значение десятичного логарифма, если LotStep является степенью 10, а что делать в случае, если оно равно 0.2, например?
extern double Lots=0.1;
extern Risk=0;

double GetLots(string _Symbol){
   double MaxLot=MarketInfo(_Symbol,MODE_MAXLOT);
   double MinLot=MarketInfo(_Symbol,MODE_MINLOT);
   double StepLot=MarketInfo(_Symbol,MODE_LOTSTEP);
   double lot=Lots;
   if (Risk>0) lot=MathRound(AccountBalance()*Risk/1000/StepLot)*StepLot;
   lot=MathMax(MathMin(lot,MaxLot),MinLot);
   return(lot);
}
Можно примерно так сделать. Размер лота пропорционален шагу изменения. И проверяется что бы был в допустимом диапазоне.
Олег
16
Олег  

Спасибо, интересный подход.

А при умножении вещественных чисел мы не приобретем ненужные знаки после запятой?

Victor Nikolaev
Модератор
13987
Victor Nikolaev  
Sheremetiev писал (а) >>

Спасибо, интересный подход.

А при умножении вещественных чисел мы не приобретем ненужные знаки после запятой?

Пока не сталкивался.
Aleksandr Pak
2156
Aleksandr Pak  

не приобретешь, и проверяется это самой фнукцией MathMod())))

y=0.01;
x=200*y;
Print (" @1 Mod 2,0.01)=",MathMod(NormalizeDouble(-x,0), NormalizeDouble(y, 2))," x=",DoubleToStr(x,15)  ); 
Print (" ##2 Mod 2,0.01)=",MathMod(x, y)," x=",DoubleToStr(x,15));
ALEKSANDR SHUKALOVICH
648
ALEKSANDR SHUKALOVICH  
Олег:

Добрый день.

Подскажите, в чем моя ошибка или подвох?

Как же тогда получить правильный результат 0?

double mode(double value1, double value2)
{
   const double result = value1 / value2;
   return (result - (int)result);
}


Use this function "mode" instead of MathMod.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий