Приведение типов double -> int или я туплю...

 

int init()
{
  return( 0 );
}

int start()
{
  // множитель для перевода цены в пункты
  int MultToInt = MathPow( 10, Digits );

  // вычисляем изменение цены
  double DeltaPrice = Close[ 0 ] - Close[ 1 ];

  // переводим изменение цены в пункты, но в double
  double DeltaPriceDouble = MultToInt * DeltaPrice;

  // думал, что так будет работать, но в этой строчке что-то не то...
  int DeltaPriceInt1 = DeltaPriceDouble;
   
  // а вот так вот отлично работает
  int DeltaPriceInt2 = StrToInteger( DoubleToStr( DeltaPriceDouble, Digits ) );

  Print( " Close[ 0 ] = ", Close[ 0 ], " Close[ 1 ] = ", Close[ 1 ], " DeltaPrice = ", DeltaPrice, " DeltaPriceDouble = ", DeltaPriceDouble, " DeltaPriceInt1 = ", DeltaPriceInt1, " DeltaPriceInt2 = ", DeltaPriceInt2 );
}

int deinit()
{
  return( 0 );
}

Очень интересно посмотреть на значения DeltaPriceInt1, которые на единицу отличаются от верного значения

2009.02.21 02:20:56 2009.01.05 00:02 Test EURUSD,M1: Close[ 0 ] = 1.389 Close[ 1 ] = 1.3888 DeltaPrice = 0.0002 DeltaPriceDouble = 2 DeltaPriceInt1 = 1 DeltaPriceInt2 = 2
2009.02.21 02:20:56 2009.01.05 00:02 Test EURUSD,M1: Close[ 0 ] = 1.3891 Close[ 1 ] = 1.3888 DeltaPrice = 0.0003 DeltaPriceDouble = 3 DeltaPriceInt1 = 2 DeltaPriceInt2 = 3
2009.02.21 02:20:55 2009.01.05 00:02 Test EURUSD,M1: Close[ 0 ] = 1.3893 Close[ 1 ] = 1.3888 DeltaPrice = 0.0005 DeltaPriceDouble = 5 DeltaPriceInt1 = 4 DeltaPriceInt2 = 5
2009.02.21 02:20:55 2009.01.05 00:02 Test EURUSD,M1: Close[ 0 ] = 1.3892 Close[ 1 ] = 1.3888 DeltaPrice = 0.0004 DeltaPriceDouble = 4 DeltaPriceInt1 = 3 DeltaPriceInt2 = 4
2009.02.21 02:20:55 2009.01.05 00:02 Test EURUSD,M1: Close[ 0 ] = 1.3893 Close[ 1 ] = 1.3888 DeltaPrice = 0.0005 DeltaPriceDouble = 5 DeltaPriceInt1 = 4 DeltaPriceInt2 = 5
2009.02.21 02:20:55 2009.01.05 00:02 Test EURUSD,M1: Close[ 0 ] = 1.3889 Close[ 1 ] = 1.3888 DeltaPrice = 0.0001 DeltaPriceDouble = 1 DeltaPriceInt1 = 0 DeltaPriceInt2 = 1
2009.02.21 02:20:54 2009.01.05 00:01 Test EURUSD,M1: Close[ 0 ] = 1.3888 Close[ 1 ] = 1.3887 DeltaPrice = 0.0001 DeltaPriceDouble = 1 DeltaPriceInt1 = 0 DeltaPriceInt2 = 1


 
Вы забываете, что вещественное 3 на самом деле может представляться как 2.9999999999, что при прямом преобразовании в int превращается в 2, а не в 3.
 
Renat >>:
Вы забываете, что вещественное 3 на самом деле может представляться как 2.9999999999, что при прямом преобразовании в int превращается в 2, а не в 3.

вывел все DeltaPriceDouble с помощью DoubleToStr( DeltaPriceDouble, Digits ), никаких 2.9999 нету.

2009.02.21 03:15:54 2009.01.05 00:02 Test EURUSD,M1: Close[ 0 ] = 1.389 Close[ 1 ] = 1.3888 DeltaPrice = 0.0002 DeltaPriceDouble = 2.0000 DeltaPriceInt1 = 1 DeltaPriceInt2 = 2
2009.02.21 03:15:53 2009.01.05 00:02 Test EURUSD,M1: Close[ 0 ] = 1.3891 Close[ 1 ] = 1.3888 DeltaPrice = 0.0003 DeltaPriceDouble = 3.0000 DeltaPriceInt1 = 2 DeltaPriceInt2 = 3
2009.02.21 03:15:53 2009.01.05 00:02 Test EURUSD,M1: Close[ 0 ] = 1.3893 Close[ 1 ] = 1.3888 DeltaPrice = 0.0005 DeltaPriceDouble = 5.0000 DeltaPriceInt1 = 4 DeltaPriceInt2 = 5
2009.02.21 03:15:53 2009.01.05 00:02 Test EURUSD,M1: Close[ 0 ] = 1.3892 Close[ 1 ] = 1.3888 DeltaPrice = 0.0004 DeltaPriceDouble = 4.0000 DeltaPriceInt1 = 3 DeltaPriceInt2 = 4
2009.02.21 03:15:53 2009.01.05 00:02 Test EURUSD,M1: Close[ 0 ] = 1.3893 Close[ 1 ] = 1.3888 DeltaPrice = 0.0005 DeltaPriceDouble = 5.0000 DeltaPriceInt1 = 4 DeltaPriceInt2 = 5
2009.02.21 03:15:52 2009.01.05 00:02 Test EURUSD,M1: Close[ 0 ] = 1.3889 Close[ 1 ] = 1.3888 DeltaPrice = 0.0001 DeltaPriceDouble = 1.0000 DeltaPriceInt1 = 0 DeltaPriceInt2 = 1
2009.02.21 03:15:52 2009.01.05 00:01 Test EURUSD,M1: Close[ 0 ] = 1.3888 Close[ 1 ] = 1.3887 DeltaPrice = 0.0001 DeltaPriceDouble = 1.0000 DeltaPriceInt1 = 0 DeltaPriceInt2 = 1

Если так и должно быть, то вопросов больше не имею :-). Но вообще мне кажется что так быть не должно. То есть double 2.0000 должен переводиться в int 2.

Как только нашёл где кроется неточность, был немного удивлён. И стал переводить double -> строка -> int.

 
Были с этим проблемы, вышел таким образом:
int a = NormalizeDouble(doub,0);
Причина обращения: