Проблема в преобразовании типов и не только...

 

Доброго время суток.

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

1.   1.  Вот кусок кода в котором вычисляются два значения и потом сравниваются между собой оператором  >= 

 Проблема в том что когда оба значения и равны допустим 0.0003 то операция имеет значения ЛОЖЬ. Вот кусок кода и лог журнала

double DownP = ShiftP - Close[i];
double RPorog = Porog*Point;
Print("#1 DownP = "+DownP+" RPorog = "+RPorog+" Time = "+TimeToStr(Time[i]));  
if (DownP >= RPorog ){
    int n = DownP / RPorog;
    Print("#2 (ShiftP - Close[i]) = "+(ShiftP - Close[i])+" (Porog*Point) = "+(Porog*Point)+" n= "+ DownP / RPorog+" "+n); 

а вот лог

2009.03.27 12:08:02 xxxxxx EURUSD,M1: 24619
2009.03.27 12:08:02 xxxxxx EURUSD,M1: #1 DownP = 0.00030000 RPorog = 0.00030000 Time = 2009.03.27 11:07

но if не сработал и в журнале нет следующего лога Print("#2…

2.  

2.  Другая проблема которая возникла в том же куске кода это вычисления целого после деления  

int n = DownP / RPorog;
Print("#2 (ShiftP - Close[i]) = "+(ShiftP - Close[i])+" (Porog*Point) = "+(Porog*Point)+" n= "+ DownP / RPorog+" "+n);

допустим когда мы делим 0.0006 на 0.0003 по по логике должны получить цело число 2, но из лога видно что переменная n после присваивания имеет значения 1.

2009.03.27 11:53:14 xxxxxx EURUSD,M1: #2 (ShiftP - Close[i]) = 0.00060000 (Porog*Point) = 0.00030000 n= 2.00000000 1

Сломал все мозги, но пока не понял как решить эти проблемы, читал доки но по ним я делаю все правильно, но результат получаю совершенно другой.

Надеюсь что кто-то подскажет где я ошибаюсь.

 
мож Digits нужно учитывать, перед сравнением ! и помнить о DoubleToStr !
 
vvavva >>:
мож Digits нужно учитывать, перед сравнением ! и помнить о DoubleToStr !

про DoubleToStr я знаю, но мне не надо значения приводить к стрингу, в логах

2009.03.27 11:53:14 xxxxxx EURUSD,M1: #2 (ShiftP - Close[i]) = 0.00060000 (Porog*Point) = 0.00030000 n= 2.00000000 1

значения 2.00000000 я специально не стал приводить в операторе Print чтобы посмотреть результат операции.


проблема вот в этой строке 

int n = DownP / RPorog

если делить 0.00060000 на 0.00030000 и привести к целому типу получается 1

 
wan >>:

Доброго время суток.

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

1. 1. Вот кусок кода в котором вычисляются два значения и потом сравниваются между собой оператором >=

Проблема в том что когда оба значения и равны допустим 0.0003 то операция имеет значения ЛОЖЬ. Вот кусок кода и лог журнала

Вместо

double RPorog = Porog*Point;

Напиши

double RPorog = (Porog - 0.5)*Point;

2.

2. Другая проблема которая возникла в том же куске кода это вычисления целого после деления

допустим когда мы делим 0.0006 на 0.0003 по по логике должны получить цело число 2, но из лога видно что переменная n после присваивания имеет значения 1.

int n = DownP / RPorog + 0.5;
 
TheXpert >>:

Вместо

Напиши


Спасибо помогло 

но логика языка все равно не понятна

 
wan >>:

Спасибо помогло 

но логика языка все равно не понятна

Это не логика языка, а правила округления: число с плавающей точкой +0.5 и отбросить дробную часть..

Успехов.

 
wan >>:

Спасибо помогло

но логика языка все равно не понятна

Это не логика языка, это логика работы с double числами.

Я пока не видел такого, чтобы с floating point числами не было проблем при сравнении и неявном преобразовании к целому.

Вобщем на язык грешить не надо, он ни при чем.

VladislavVG >>:
 
wan писал(а) >>

про DoubleToStr я знаю, но мне не надо значения приводить к стрингу, в логах

значения 2.00000000 я специально не стал приводить в операторе Print чтобы посмотреть результат операции.

проблема вот в этой строке

если делить 0.00060000 на 0.00030000 и привести к целому типу получается 1

    double pd1=0.00060000;
    double pd2=0.00030000;
    double pd3= pd1 / pd2;
    int pint= pd1 / pd2;
    string ps=StringConcatenate(
      " pd3=", DoubleToStr(pd3,8)
      ," pint=", DoubleToStr(pint,8)
      );
    Print(ps);

результат: pd3=2.00000000 pint=2.00000000

мож я чё не так сделал или комп не верно считает, но единица не получается!?