Точность вычисления. Преобразование вещественного числа в целое.

 
//+------------------------------------------------------------------+
//|                                                         Test.mq4 |
//+------------------------------------------------------------------+

double const=0.0001;
double x;
int a1,a2;

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
   int i;
   string str;
//----
   for(i=45;i<64;i++)
      {
      a1=i;
      x=a1*const;
      a2=MathFloor(x/const);
      
      if(a1==a2)str="; ok ";
        else str="; !!!";
      
      Print( "a1=a2 => ",a1 ,"=",a2 ,str , "  x=",DoubleToStr(x,8) );
      }
//----
   
   return(0);
  }
//+------------------------------------------------------------------+

14:18:08 Compiling 'Test'
14:18:08 Test GBPUSD,Daily: loaded successfully
14:18:08 Test GBPUSD,Daily: a1=a2 => 45=45; ok   x=0.00450000
14:18:08 Test GBPUSD,Daily: a1=a2 => 46=46; ok   x=0.00460000
14:18:08 Test GBPUSD,Daily: a1=a2 => 47=47; ok   x=0.00470000
14:18:08 Test GBPUSD,Daily: a1=a2 => 48=48; ok   x=0.00480000
14:18:08 Test GBPUSD,Daily: a1=a2 => 49=48; !!!  x=0.00490000
14:18:08 Test GBPUSD,Daily: a1=a2 => 50=50; ok   x=0.00500000
14:18:08 Test GBPUSD,Daily: a1=a2 => 51=51; ok   x=0.00510000
14:18:08 Test GBPUSD,Daily: a1=a2 => 52=52; ok   x=0.00520000
14:18:08 Test GBPUSD,Daily: a1=a2 => 53=53; ok   x=0.00530000
14:18:08 Test GBPUSD,Daily: a1=a2 => 54=54; ok   x=0.00540000
14:18:08 Test GBPUSD,Daily: a1=a2 => 55=55; ok   x=0.00550000
14:18:08 Test GBPUSD,Daily: a1=a2 => 56=56; ok   x=0.00560000
14:18:08 Test GBPUSD,Daily: a1=a2 => 57=57; ok   x=0.00570000
14:18:08 Test GBPUSD,Daily: a1=a2 => 58=58; ok   x=0.00580000
14:18:08 Test GBPUSD,Daily: a1=a2 => 59=58; !!!  x=0.00590000
14:18:08 Test GBPUSD,Daily: a1=a2 => 60=60; ok   x=0.00600000
14:18:08 Test GBPUSD,Daily: a1=a2 => 61=61; ok   x=0.00610000
14:18:08 Test GBPUSD,Daily: a1=a2 => 62=62; ok   x=0.00620000
14:18:08 Test GBPUSD,Daily: a1=a2 => 63=63; ok   x=0.00630000
14:18:08 Test GBPUSD,Daily: uninit reason 0
14:18:08 Test GBPUSD,Daily: removed
 

Глюк какой то. Как быть? Целое число умножается на константу "const", затем обратно делится на эту же константу, однако результат не всегда оказывается равным предыдущему числу. При 49 и 59, получается 48 и 58 соответственно.

Непонятно почему 0.00590000 разделить на 0.0001 получается 58 ?

 
 

Вероятно, это особенность MathFloor()

https://www.mql5.com/ru/forum/129561

 

Понятно.