Сравнение чисел double - ошибка !?

 

double ray =  ObjectGetValueByTime(0, ray_name, mrate_M5[i].time, 0);
     

      if(mrate_M5[i].high > ray // почему то глючит!!!!!!!!!!!
           ){
         Print("!!!!!  mrate_M5[i].high > ray  !!!!!!!!!!!   ray " + ray + ",  цена high=" + mrate_M5[i].high + ",  время =" + mrate_M5[i].time);
      }

и вот что выдает

2018.08.18 20:40:12.791 2018.07.11 21:45:00   !!!!!  mrate_M5[i].high > ray   !!!!!!   ray_= 23568.0,  цена high=23506.0,  время =2018.07.10 16:25:00

// однако цена меньше ray , через раз выдает то правильно , то неправильно

Это ошибка терминала?

 
Нечто вроде квадратного трехчлена. Нихрена не понятно. Код совершенно секретен, как я понимаю? 
 
 
vlad-mir:

Это ошибка терминала?

А так?

datetime _time = mrate_M5[i].time;
double    _ray = mrate_M5[i].high;
double ray =  ObjectGetValueByTime(0, ray_name, _time, 0);
      if(_ray > ray
           ){
         Print("!!!!!  mrate_M5[i].high > ray  !!!!!!!!!!!   ray " + ray + ",  цена high=" + _ray + ",  время =" + _time);
      }
 

Поищите по форуму. 158 раз уже обсуждалось это. 

Нельзя в лоб сравнbвать числа double. Можно типа так 

double с = a-b;

if (c >_Point) Print ("a>b");

else if (c < -_Point) Print ("a<b");

else Print ("a=b");
 
Dmitiry Ananiev:

Поищите по форуму. 158 раз уже обсуждалось это. 

Нельзя в лоб сравнbвать числа double. Можно типа так 

Ну объясните пожалуйста нам тупым в 159-ый раз почему нельзя сравнить 23506.0 и 23568.0  ?

А лучше сначала вникните в суть вопроса!

 
A100:

Ну объясните пожалуйста нам тупым в 159-ый раз почему нельзя сравнить 23506.0 и 23568.0  ?

А лучше сначала вникните в суть вопроса!

Так можно. А вот  взять 1.23456 можнт не быть равно 1.23456. 
 
У вас скорее всего одно из сравниваемых чисел не извлекается из структуры и  =0 или чему  то еще. 
 
вот здесь Print("!!!!!  mrate_M5[i].high уже может не быть =_ray. Я бы так не стал писать комментарий .
 

Числа Double - числа с плавающий запятой, пример как это работает:

  • вы пишите double a = 1.222, b = 1.222; и думаете, что они равны,
  • но на самом деле, там может быть: a = 1.21999999999   и    b = 1.222000001   и значение a==b не будет Истиной
  • при этом вы можете написать следующий строкой: double c = a   и    при следующей проверке (a==c) это тоже может не быть истиной


Я сравниваю double так:

  1. я нормализую оба числа: NormalizeDouble(a, _Digits)
  2. сравниваю их разность


Как-то один опытный программист (с опытом 20+ лет) сказал мне, что в безотказных крупных системах (конкретно он пишет софт для нефтезаводов) уходят от типа double в пользу int, потому что с int такой ситуации невозможно

 
Mikhail Mitin:

Я сравниваю double так:

  1. я нормализую оба числа: NormalizeDouble(a, _Digits)
  2. сравниваю их разность

на форуме раньше часто вот такой код писали, я давно сохранил и пользуюсь:

bool CompareDoubles(double number1,double number2)
  {
   if(NormalizeDouble(number1-number2,8)==0.0) return(true);
   else return(false);
  }