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

 

수학. 6 학년. 교과서. Nikolsky S.M., Potapov M.K. M.: 2012. - 256p.

반올림.

반올림

 

폭풍 같은 주제입니다. 반올림하면 MT4가 올바르게 작동하는 것 같습니다.
NormalizeDouble(0.055,2)숫자 "0.055"를 "0.06"으로 반올림하지 않고 "0.05"로 자르도록 보기가 있었습니다.

MKL의 이러한 기능에 대해 오해가 있습니다. CUT-OFF 번호를 필요한 기호로 가져가기만 하면 된다면 가격 "1.0015223567"을 NormalizeDouble 함수로 반올림해야 하는 이유를 잘 모르겠습니다.
즉, NormalizeDouble(1.001526789, 5)의 경우 결과적으로 "1.00152"를 제공합니다.
" 1.00153 " 으로 반올림할 필요는 없습니다 . 이를 위한 RoundDouble 함수가 있어야 합니다 =)

그게 가능한가요? 아니면 끊임없이 반올림하여 원하는 잘못된 숫자를 얻어야 합니까?

 

당신은 이미 마음을 정했을 것입니다, 그렇죠? 반올림:

가 숫자 "0.055"를 "0.06"으로 반올림하는 이유는 무엇입니까?

이것은 분수를 반올림하는 기능이 아닙니다.


그것은 반올림하지 않습니다 :

숫자 "0.055"를 "0.06"으로 반올림하지 않고 "0.05"로 자르도록 보기가 있었습니다.

MKL의 이러한 기능에 대해 오해가 있습니다. CUT-OFF 번호를 필요한 기호로 가져가기만 하면 된다면 가격 "1.0015223567"을 NormalizeDouble 함수로 반올림해야 하는 이유를 잘 모르겠습니다.
즉, NormalizeDouble(1.001526789, 5)의 경우 결과적으로 "1.00152"를 제공합니다.
" 1.00153 " 으로 반올림할 필요는 없습니다 . 이를 위한 RoundDouble 함수가 있어야 합니다 =)

그게 가능한가요? 아니면 끊임없이 반올림하여 원하는 잘못된 숫자를 얻어야 합니까?


음, 실험을 위해:

 //+------------------------------------------------------------------+
//|                                              NormalizeDouble.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
#property script_show_inputs
#property description "Проверка NormalizeDouble"
input double    value= 0.055 ;       // нормализуемое число 
input int       digits= 2 ;         // кол-во знаков после запятой 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   Print ( "Число " ,value, " округлённое с точностью до " ,digits, " знаков = " , NormalizeDouble (value,digits));
  }
//+------------------------------------------------------------------+
파일:
Test.mq5  2 kb
 
Roman Starinskij :

폭풍 같은 주제입니다. 반올림하면 MT4가 올바르게 작동하는 것 같습니다.
NormalizeDouble(0.055,2)숫자 "0.055"를 "0.06"으로 반올림하지 않고 "0.05"로 자르도록 보기가 있었습니다.

MKL의 이러한 기능에 대해 오해가 있습니다. CUT-OFF 번호를 필요한 기호로 가져가기만 하면 된다면 가격 "1.0015223567"을 NormalizeDouble 함수로 반올림해야 하는 이유를 잘 모르겠습니다.
즉, NormalizeDouble(1.001526789, 5)의 경우 결과적으로 "1.00152"를 제공합니다.
" 1.00153 " 으로 반올림할 필요는 없습니다 . 이를 위한 RoundDouble 함수가 있어야 합니다 =)

그게 가능한가요? 아니면 끊임없이 반올림하여 원하는 잘못된 숫자를 얻어야 합니까?

잘라야 하는 경우 잘라야 하고 둥글게 해야 하는 경우. NormalkizeDouble() 함수는 반올림되며 이것이 가장 자주 필요한 것입니다.

반올림을 위해 NormalizeDouble()이 아니라 RoundDouble()이 있어야 합니다. 이 세상을 창조하신 겁니까? 그러나 공이 굴러가는 것은 없지만 사각형에는 네 개의 모서리가 있습니까?

 
Roman Starinskij :

폭풍 같은 주제입니다.


topikstarter가 언어에 대한 문서를 읽지 않고 그들이 말하는 것을 듣지 않는다는 사실에서 모든 것
 
Slawa :
topikstarter가 언어에 대한 문서를 읽지 않고 그들이 말하는 것을 듣지 않는다는 사실에서 모든 것

분수의 나누기와 반올림의 다음 동작은 약간 불명확합니다.

2개의 방정식이 있습니다.
0.06-0.02 = 0.03999999999999999
0.06-0.024 = 0.036

권장되는 NormalizeDouble 함수 를 사용하여 다음과 같은 결과를 얻습니다.
0.03999999999999999 = 0.04
0.036 = 0.04

첫 번째 예에서는 실제로 0.04 값을 얻어야 하지만 두 번째 예에서는 0.03 (일반적인 계산기가 생각하는 것)입니다.
NormalizeDouble을 사용하는 것은 분수가 완전하게 반환되지 않기 때문에 필요하지만 두 번째 경우에는 함수가 잘못된 값을 반환하고 첫 번째 옵션에 사용하지 않는 것도 불가능합니다.

 
Roman Starinskij :

분수의 나누기와 반올림의 다음 동작은 약간 불명확합니다.

2개의 방정식이 있습니다.
0.06-0.02 = 0.03999999999999999
0.06-0.024 = 0.036

권장되는 NormalizeDouble 함수 를 사용하여 다음과 같은 결과를 얻습니다.
0.03999999999999999 = 0.04
0.036 = 0.04

첫 번째 예에서는 실제로 0.04 값을 가져와야 하지만 두 번째 예에서는 0.03 (일반적인 계산기가 생각함)입니다.
NormalizeDouble을 사용하는 것은 분수가 완전하게 반환되지 않기 때문에 필요하지만 두 번째 경우에는 함수가 잘못된 값을 반환하고 첫 번째 옵션에 사용하지 않는 것도 불가능합니다.

일반적인 계산기는 올바르게 계산되지 않습니다. 다음과 같아야 합니다.

 
Slawa :
topikstarter가 언어에 대한 문서를 읽지 않고 그들이 말하는 것을 듣지 않는다는 사실에서 모든 것

N+1 문자 < 5이면 N 번째 문자가 유지되고 N+1 및 모든 후속 문자가 0으로 설정됩니다.

N+1 부호 ≥ 5이면 N번째 부호가 1 증가 하고 N+1 모든 후속 0;

미안하지만 '2'로 반올림하는 것이 즉시 = 0.06000000을 얻을 수 없는 이유를 여전히 이해하지 못합니다.

 void OnStart ()
  {

   double v1 = NormalizeDouble ( 0.055 , 3 );
   double v2 = NormalizeDouble ( 0.0549 , 3 );

   v1= NormalizeDouble (v1, 2 );
   v2= NormalizeDouble (v2, 2 );
   Print ( "v1 = " , DoubleToString (v1), ", v2 = " , DoubleToString (v2));

  }

v1 = 0.06000000, v2 = 0.06000000

 void OnStart ()
  {

   double v1 = NormalizeDouble ( 0.055 ,2);
   double v2 = NormalizeDouble ( 0.0549 ,2);

   Print ( "v1 = " , DoubleToString (v1), ", v2 = " , DoubleToString (v2));

  }

v1 = 0.06000000, v2 = 0.05000000

 void OnStart ()
  {
   for ( int i= 7 ;i>= 1 ;i--)
     {
       double v1 = 1.1234567 ;
       double v2 = NormalizeDouble (v1,i+ 1 );

      v1= NormalizeDouble (v1,i);
      v2= NormalizeDouble (v2,i);
       Print ( "v1 = " ,i, " = " , DoubleToString (v1, 7 ), ", v2 = " ,i, " = " , DoubleToString (v2, 7 ));
     }
     Print ( "---" );
  }

---

v1 = 1 = 1.1000000, v2 = 1 = 1.1000000
v1 = 2 = 1.1200000, v2 = 2 = 1.1200000
v1=3=1.1230000, v2=3=1.1240000
v1=4=1.1235000, v2=4=1.1235000
v1=5=1.1234600, v2=5=1.1234600
v1=6=1.1234570, v2=6=1.1234570
v1=7=1.1234567, v2=7=1.1234567




 
lilita bogachkova :


죄송하지만 '2'로 반올림하는 것이 즉시 = 0.06000000을 얻을 수 없는 이유를 여전히 이해하지 못합니다.


0.6과 같기 때문에 0.5는 속임수로만 얻을 수 있습니다.
 
lilita bogachkova :

미안하지만 '2'로 반올림하는 것이 즉시 = 0.06000000을 얻을 수 없는 이유를 여전히 이해하지 못합니다.


하나의 부호만 정규화되면 모든 것이 간단합니다. 0, 1, 2, 3, 4 -> 0, 5, 6, 7, 8, 9 -> 1

두 자리가 정규화되면 0 - 49 -> 0 및 50 - 99 -> 1과 같은 두 자리 숫자가 고려됩니다. 결국 숫자 1.49를 정수로 반올림해야 하는 경우 실제로 다음을 얻어야 합니다. 2, 1까지의 거리의 가용한 49/100에 대한 51/100은?

세 자리, 네 자리 등도 마찬가지입니다.