MQL4 및 MQL5에서 Digits()를 무시하고 숫자(따옴표 제외)의 쉼표 뒤 소수 자릿수 가져오기

 

소수점 이하 자릿수를 구해야 하는 경우가 드물고 Digits() 함수는 따옴표로만 작동하며 이에 대한 정보가 없는 경우가 저뿐만이 아닌 것 같습니다. 아무데나 (적어도 이전에 이 게시물을 작성할 당시에는 찾지 못했기 때문에 내가 찾은 솔루션을 보여주고 싶습니다)?


결과적으로 본질은 매우 간단하지만 여전히 한 가지 단점이 있습니다. 이 기능은 그 뒤에 다른 숫자가 없으면 0을 인식하지 못합니다. 예를 들어, 함수에 숫자 0.01이 주어지면 2를 반환하고 0.0000이면 0을 반환합니다(즉, 4개의 0이 표시되지 않음). 따라서 개발에서 이러한 단점을 고려하십시오.


MQL4의 코드

 int Digits_values( double value )
  {
   int digits = 0 ;
   string string_value = ( string ) value ;
   int limit = StringLen(string_value);
   for ( int i = 1 ; i < limit; i++)
     {
       if (StringSubstr(string_value,i, 1 ) == "." )
        {
         digits = limit - (i + 1 ); break ;
        };
     };
   //-----------------------------------------------------------------
   return (digits);
  }


MQL5의 코드

 int Digits_values( double value)
  {
   int digits = 0 ;
   string string_value = ( string )value;
   int limit = StringLen (string_value);
   for ( int i = 1 ; i < limit; i++)
     {
       if ( StringSubstr (string_value,i, 1 ) == "." )
        {
         if (i == limit - 2 )
           {
             if ( StringSubstr (string_value,limit- 2 , 1 ) == "." && StringSubstr (string_value,limit- 1 , 1 ) == "0" )
              {
               break ;
              }
             else
              {
               digits = 1 ; break ;
              };
           }
         else
           {
            digits = limit - (i + 1 ); break ;
           };
        };
     };
   //-----------------------------------------------------------------
   return (digits);
  }

MQL5의 코드는 약간 개선되어야 했습니다. MQL5에서 분명히 double 유형의 변수는 정수가 할당되었는지 여부에 관계없이 끝에 자동으로 0이 할당되기 때문입니다. 그리고 이러한 이유로 함수는 0을 반환하지 않았습니다.

 
Alexandr Sokolov :

소수점 이하 자릿수를 구해야 하는 경우가 드물고 Digits() 함수는 따옴표로만 작동하며 이에 대한 정보가 없는 경우가 저뿐만이 아닌 것 같습니다. 아무데나(적어도 이 게시물을 작성하는 시점에서 이전에 찾았으므로 내가 찾은 솔루션을 보여주고 싶습니다)?

결과적으로 본질은 매우 간단하지만 여전히 한 가지 단점이 있습니다. 이 기능은 그 뒤에 다른 숫자가 없으면 0을 인식하지 못합니다. 예를 들어, 함수에 숫자 0.01이 주어지면 2를 반환하고 0.0000이면 0을 반환합니다(즉, 4개의 0이 표시되지 않음). 따라서 개발에서 이러한 단점을 고려하십시오.

MQL5의 코드는 약간 개선되어야 했습니다. MQL5에서 분명히 double 유형의 변수는 정수가 할당되었는지 여부에 관계없이 끝에 자동으로 0이 할당되기 때문입니다. 그리고 이러한 이유로 함수는 0을 반환하지 않았습니다.

숫자 2.4875를 지정하면 함수는 4를 반환합니다.

그리고 이것으로 다음에 무엇을해야합니까? 내가 요점을 이해하지 못한 것

 
Alexandr Sokolov :

소수점 이하 자릿수를 구해야 하는 경우가 드물고 Digits() 함수는 따옴표로만 작동하며 이에 대한 정보가 없는 경우가 저뿐만이 아닌 것 같습니다. 아무데나(적어도 이 게시물을 작성하는 시점에서 이전에 찾았으므로 내가 찾은 솔루션을 보여주고 싶습니다)?


결과적으로 본질은 매우 간단하지만 여전히 한 가지 단점이 있습니다. 이 기능은 그 뒤에 다른 숫자가 없으면 0을 인식하지 못합니다. 예를 들어, 함수에 숫자 0.01이 주어지면 2를 반환하고 0.0000이면 0을 반환합니다(즉, 4개의 0이 표시되지 않음). 따라서 개발에서 이러한 단점을 고려하십시오.


MQL4의 코드


MQL5의 코드

MQL5의 코드는 약간 개선되어야 했습니다. MQL5에서 분명히 double 유형의 변수는 정수가 할당되었는지 여부에 관계없이 끝에 자동으로 0이 할당되기 때문입니다. 그리고 이러한 이유로 함수는 0을 반환하지 않았습니다.

~ 후에
 string string_value = ( string ) value ;

더 이상 읽을 필요가 없습니다 :-)

 
Vitaly Muzichenko :

숫자 2.4875를 지정하면 함수는 4를 반환합니다.

그리고 이것으로 다음에 무엇을해야합니까? 내가 요점을 이해하지 못한 것

누가 무엇을 필요로 하는지에 따라. 예를 들어 상관 지수를 더 쉽게 계산하기 위해 정수가 필요했습니다.

 
Maxim Kuznetsov :

더 이상 읽을 필요가 없습니다 :-)

프로그래머에게 명확하지 않은 것은 무엇입니까?))

 
StringFind() 함수가 있는 경우 검색을 위해 문자를 반복할 필요가 없습니다.
 
Dmitry Fedoseev :
StringFind() 함수가 있는 경우 검색을 위해 문자를 반복할 필요가 없습니다.

고맙습니다

 

찢어

 int GetDigits( double Price )
{
   int Res = 0 ;

   while (( bool )(Price = :: NormalizeDouble (Price - ( int )Price, 8 )) && (Res < 8 ))
  {
    Price *= 10 ;

    Res++;
  }

   return (Res);
}
 
fxsaber :
찢어

또한 좋은 솔루션

 
Alexandr Sokolov :

또한 좋은 솔루션

좋은 솔루션은 일반적으로 올바르게 작동합니다.

 void OnStart ()
{
         double price = 500000000.0001 ;
         Print ( price, ":" , GetDigits( price ));
}

결과: 500000000.0001:8

소수점 이하 자릿수는 몇 개입니까? 정말 8?

 
A100 :

좋은 솔루션은 일반적으로 올바르게 작동합니다.

결과: 500000000.0001:8

소수점 이하 자릿수는 몇 개입니까? 정말 8?

예, 여덟.