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

 

Добрый день.

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

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

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

 
Sheremetiev писал (а) >>

Добрый день.

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

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

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

 

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

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

 
Sheremetiev писал (а) >>

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

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

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

 

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

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

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

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

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

 
Sheremetiev писал (а) >>

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

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

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

не приобретешь, и проверяется это самой фнукцией 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));
 
Олег:

Добрый день.

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

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

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


Use this function "mode" instead of MathMod.