NormalizeDouble을 사용하여 MT4에서 숫자 반올림 - 페이지 14

 

나는 한 번 아래에서 반올림하는 함수를 만들었습니다.

아마도 누군가가 도울 것입니다

 //+------------------------------------------------------------------+
double RoundMax( double price, double symbol_point, int symbol_digits)
  {
   return ( NormalizeDouble (price+MyK(price,symbol_point,symbol_digits)*symbol_point, symbol_digits- 1 ));
  }
//+------------------------------------------------------------------+
double RoundMin( double price, double symbol_point, int symbol_digits)
  {
   return ( NormalizeDouble (price-MyK(price,symbol_point,symbol_digits)*symbol_point, symbol_digits- 1 ));
  }
//+------------------------------------------------------------------+
int MyK( double price, double symbol_point, int symbol_digits)
  {
   double tmp1= NormalizeDouble (price, symbol_digits);
   double tmp2= NormalizeDouble (price, symbol_digits- 1 );
   return (( MathAbs (tmp1-tmp2)<symbol_point)? 10 : 5 );
  }
//+------------------------------------------------------------------+
 
Victor Nikolaev :

나는 한 번 아래에서 반올림하는 함수를 만들었습니다.

아마도 누군가가 도울 것입니다

감사합니다 컬렉션에 추가하겠습니다
 
lilita bogachkova :

결과를 얻으 십시오 0.99999999999999999

X = 0.99999999999999999

10*X = 10*0.99999999999999999

10*XX = 10*0.99999999999999999-0.99999999999999999

9*X = 9*0.99999999999999999

우리는 9*X = 9를 얻거나 X가 1(일)입니다

v1 = (1/3) = 0.33333333 | v2 = 3*(1/3) = 1.00000000

또는 0.99999999999999999 = 1.0

v1(1.00000000) >= 1.0

이 경우 0.9999999999999999999999는 1.0을 나타냅니다. 그러나 작업은 "폐기"되어야 하며, 이는 결과가 9여야 함을 의미합니다.
 

도움이 되는 스레드에 대해 모두 감사합니다!

나 자신을 위해 NormalizeDouble 을 통해 1 자리 더 반올림한 다음 마지막 자리를 잘라내는 솔루션을 선택했습니다. 여기까지는 완벽하게 맞습니다.

 

그리고 다시 반올림에 대해 .......

상황에 따라 말씀해주세요(토마토는 던지지 마세요, 저는 휴머니스트입니다),

이 변수가 있습니다:

      double delta=NormalizeDouble(new_lot-sum_lots,Lots_Digits);

      if(delta>0) delta-=OrderLots();

      if(delta<0) delta+=OrderLots();

이론적으로 델타는 초기에 정규화되며,

OrderLots는 아마도 정규화된 double을 반환해야 할 것입니다.

하지만 가끔 드물게 2.775557561562891e-17과 같은 숫자를 얻습니다.

즉, 거의 0이지만 0은 아닙니다........

첫 번째 질문은 이것이 정상입니까?

두 번째 질문 - 내가 이해하는 한 두 번째 정규화로 꼬리가 나타나지 않도록 충분합니까?

세 번째 질문(아직도 이해하지 못하는 예감이 있지만 어쨌든 질문하겠습니다):

두 개의 정규화된 숫자를 추가하면 비정규화된 숫자를 얻을 수 있습니까?

추신: 다시 이 문제를 제기해서 죄송합니다만, 이 모든 것을 다시 읽을 힘이 없습니다


 
transcendreamer :

그리고 다시 반올림에 대해 .......

상황에 따라 말씀해주세요(토마토는 던지지 마세요, 저는 휴머니스트입니다),

이 변수가 있습니다:

      double delta=NormalizeDouble(new_lot-sum_lots,Lots_Digits);

      if(delta>0) delta-=OrderLots();

      if(delta<0) delta+=OrderLots();

이론적으로 델타는 초기에 정규화되며,

OrderLots는 아마도 정규화된 double을 반환해야 할 것입니다.

하지만 가끔 드물게 2.775557561562891e-17과 같은 숫자를 얻습니다.

즉, 거의 0이지만 0은 아닙니다........

첫 번째 질문은 이것이 정상입니까?

두 번째 질문 - 내가 이해하는 한 두 번째 정규화로 꼬리가 나타나지 않도록 충분합니까?

세 번째 질문(아직도 이해하지 못하는 예감이 있지만 어쨌든 질문하겠습니다):

두 개의 정규화된 숫자를 추가하면 비정규화된 숫자를 얻을 수 있습니까?

추신: 다시 이 문제를 제기해서 죄송합니다만, 이 모든 것을 다시 읽을 힘이 없습니다

  1. 네.
  2. 네.
  3. 네.
 
fxsaber :
  1. 네.
  2. 네.
  3. 네.
고맙습니다
 
transcendreamer :

추신: 다시 이 문제를 제기해서 죄송합니다만, 이 모든 것을 다시 읽을 힘이 없습니다

다른 예를 통해 직접 확인하는 것이 좋습니다. 그러면 이해가 될 것입니다.

내가 잘못하고있는 유일한 것은 다음과 같습니다.

 if (delta> 0 )

그래서

 if (delta> 0.0 )

복식용. 이것이 정말로 중요한지는 모르겠지만, 제 버전에 따르면 오류가 발생한 적이 없습니다(같은 유형의 변수만 비교하려고 합니다).

 
Andrey Dik :

이것이 정말로 중요한지 는 모르겠지만, 내 버전에 따르면 오류가 발생한 적이 없습니다(같은 유형의 변수만 비교하려고 함).

없습니다.
 
일부 숫자는 십진법의 1/3과 같이 무한 분수로만 나타낼 수 있습니다. 그러나 1/3은 3차 시스템에서 무한 분수가 아니며 == 0.1입니다. 저것들. 다른 숫자 체계에는 고유한 무한 분수가 있습니다. 따라서 십진수의 무한하지 않은 분수는 이진수와 같을 수 있습니다. 예: 0.1, 0.2, 0.3, 0.4, ...에는 정확한 이진 표현이 없습니다. NormalizeDouble을 10번 이상 호출 하면 0.199999999..1 또는 0.200000...1이 됩니다. 뉴스인지 모르겠네요.