НЕ РАБОТАЕТ MathMod !!! - страница 2

 

Все это только означает, что хелп по этой функции надо явно сделать лучше, чтобы предупредить о подводных камнях.

Попробовал справиться вот так:

int start()
{
  Print( MathMod( NormalizeDouble( 4, 0 ), NormalizeDouble( 0.5, 1 ) ) ); //возвращает 0
  Print( MathMod( NormalizeDouble( 4, 0 ), NormalizeDouble( 0.4, 1 ) ) ); //возвращает 0.4
  
  return( 0 );
}
Не вышло, как видим...
 
stringo:

Мы ничего никуда не округляем (до 0.1 или до 0.4). Почитайте документацию. Это Print выводит вещественные числа с точностью до 4-го знака. Хотите увидеть (именно увидеть) точность до 8-го знака используйте функцию DoubleToStr.

Слава, вот так правильно будет?

Print(DoubleToStr(MathMod(4, 0.8), 8));
 
В хелпе по функции Print явно сказано "Данные типа double выводятся с 4 десятичными цифрами после точки. Чтобы получить большую точность, следует использовать функцию DoubleToStr()."
 
KimIV:

Слава, вот так правильно будет?

Print(DoubleToStr(MathMod(4, 0.8), 8));

Да

 
stringo:
KimIV:

Слава, вот так правильно будет?

Print(DoubleToStr(MathMod(4, 0.8), 8));

Да

Благодарю...

Print(DoubleToStr(MathMod(4, 0.8), 8)); пишет 2007.10.05 14:17:56 Test EURGBP,H1: 0.80000000

 

Ну и что?

Print(DoubleToStr(MathMod(4, 0.4), 8));
Возвращается 0.40000000. Не решает это проблему.
 

Возвращает 0.3999999999999998

Вот исходник для DoubleToStrMorePrecision

//+------------------------------------------------------------------+
//|                                                      TestMod.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net/"
 
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   Print(DoubleToStrMorePrecision(MathMod(4.0, 0.4), 16));
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| up to 16 digits after decimal point                              |
//+------------------------------------------------------------------+
string DoubleToStrMorePrecision(double number,int precision)
  {
   double rem,integer,integer2;
   double DecimalArray[17]={ 1.0, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0,  10000000.0, 100000000.0,
                             1000000000.0, 10000000000.0, 100000000000.0, 10000000000000.0, 100000000000000.0,
                             1000000000000000.0, 1000000000000000.0, 10000000000000000.0 };
   string intstring,remstring,retstring;
   bool   isnegative=false;
   int    rem2;
//----
   if(precision<0)  precision=0;
   if(precision>16) precision=16;
//----
   double p=DecimalArray[precision];
   if(number<0.0) { isnegative=true; number=-number; }
   integer=MathFloor(number);
   rem=MathRound((number-integer)*p);
   remstring="";
   for(int i=0; i<precision; i++)
     {
      integer2=MathFloor(rem/10);
      rem2=NormalizeDouble(rem-integer2*10,0);
      remstring=rem2+remstring;
      rem=integer2;
     }
//----
   intstring=DoubleToStr(integer,0);
   if(isnegative) retstring="-"+intstring;
   else           retstring=intstring;
   if(precision>0) retstring=retstring+"."+remstring;
   return(retstring);
  }
//+------------------------------------------------------------------+
 
KimIV:

Благодарю...

Print(DoubleToStr(MathMod(4, 0.8), 8)); пишет 2007.10.05 14:17:56 Test EURGBP,H1: 0.80000000


А у Вас возвращает 0.7999999999999998. Если воспользоваться функцией DoubleToStrMorePrecision
 
stringo:
KimIV:

Благодарю...

Print(DoubleToStr(MathMod(4, 0.8), 8)); пишет 2007.10.05 14:17:56 Test EURGBP,H1: 0.80000000


А у Вас возвращает 0.7999999999999998. Если воспользоваться функцией DoubleToStrMorePrecision
Слава, дак это же математически неправильно. Должен быть 0.
 

Опять за рыбу деньги. С самого начала о чём разговор был? О входных параметрах. В Вашем случае на входе не ровно 0.8, а 0.80000000000000004 (4 в 17-м знаке после запятой, дебагер от вижуал студио мне показал)

Добро пожаловать в мир вещественных чисел.

Если Вам это не нравится (явно не нравится) переводите все Ваши вычисления на целочисленную основу.

Причина обращения: