NormalizeDouble kullanarak MT4'te sayıları yuvarlama - sayfa 3

 

Matematik. 6. sınıf. Ders kitabı. Nikolsky S.M., Potapov M.K. E.: 2012. - 256 s.

Yuvarlama.

yuvarlama

 

Ne fırtınalı bir konu. Yuvarlama ile MT4 düzgün çalışıyor gibi görünüyor.
NormalizeDouble(0.055,2) 'nin "0.055" sayısını "0.06"ya yuvarlamaması, ancak "0.05" olarak kesmesi için görüşlerim vardı.

MKL'nin bu işlevleriyle ilgili bir yanlış anlama var. Sadece CUT-OFF numarasını gerekli işarete götürmeniz gerekiyorsa, "1.0015223567" fiyatlarının NormalizeDouble işlevi tarafından neden yuvarlanması gerektiğini gerçekten anlamıyorum.
Yani, NormalizeDouble(1.001526789, 5) için "1.00152" sonuç vermesi.
" 1.00153 " e yuvarlamanıza gerek yok . Bunun için bir RoundDouble işlevi olmalı =)

Mümkün mü? Yoksa istediğiniz yanlış sayıları sürekli olarak yuvarlamanız ve almanız mı gerekiyor?

 

Kararını çoktan vermiş olurdun, değil mi? Bu yuvarlar:

sayısını "0.06"ya yuvarlar?

Bu, kesirleri yuvarlamanın bir işlevi değildir.


yuvarlanmıyor:

sayısını "0.06"ya yuvarlamaması, ancak "0.05" olarak kesmesi için görüşlerim vardı.

MKL'nin bu işlevleriyle ilgili bir yanlış anlama var. Sadece CUT-OFF numarasını gerekli işarete götürmeniz gerekiyorsa, "1.0015223567" fiyatlarının NormalizeDouble işlevi tarafından neden yuvarlanması gerektiğini gerçekten anlamıyorum.
Yani, NormalizeDouble(1.001526789, 5) için "1.00152" sonucu verir.
" 1.00153 " e yuvarlamanıza gerek yok . Bunun için bir RoundDouble işlevi olmalı =)

Mümkün mü? Yoksa sürekli olarak toplamanız ve istediğiniz yanlış sayıları almanız mı gerekiyor?


Peki, deneyler için:

 //+------------------------------------------------------------------+
//|                                              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));
  }
//+------------------------------------------------------------------+
Dosyalar:
Test.mq5  2 kb
 
Roman Starinskij :

Ne fırtınalı bir konu. Yuvarlama ile MT4 düzgün çalışıyor gibi görünüyor.
NormalizeDouble(0.055,2) 'nin "0.055" sayısını "0.06"ya yuvarlamaması, ancak "0.05" olarak kesmesi için görüşlerim vardı.

MKL'nin bu işlevleriyle ilgili bir yanlış anlama var. Sadece CUT-OFF numarasını gerekli işarete götürmeniz gerekiyorsa, "1.0015223567" fiyatlarının NormalizeDouble işlevi tarafından neden yuvarlanması gerektiğini gerçekten anlamıyorum.
Yani, NormalizeDouble(1.001526789, 5) için "1.00152" sonucu verir.
" 1.00153 " e yuvarlamanıza gerek yok . Bunun için bir RoundDouble işlevi olmalı =)

Mümkün mü? Yoksa sürekli olarak toplamanız ve istediğiniz yanlış sayıları almanız mı gerekiyor?

Kesmeniz gerekiyorsa - kesin, yuvarlamanız gerekiyorsa - kesin. NormalkizeDouble() işlevi döner ve bu tam olarak en sık ihtiyaç duyulan şeydir.

Bunu neden yuvarlama için aldılar, NormalizeDouble() değil RoundDouble() olmalı. Bu dünyayı sen mi yarattın? Ama topun yuvarlandığı hiçbir şey yok, ama karenin dört köşesi var mı?

 
Roman Starinskij :

Ne fırtınalı bir konu.


Topikstarter'ın dille ilgili belgeleri okumadığı ve söylediklerini dinlemediği gerçeğinden her şey
 
Slawa :
Topikstarter'ın dille ilgili belgeleri okumadığı ve söylediklerini dinlemediği gerçeğinden her şey

Kesirlerin aşağıdaki bölme ve yuvarlama davranışı biraz belirsizdir.

2 denklem vardır:
0.06-0.02 = 0.03999999999999999
0.06-0.024 = 0.036

Önerilen NormalizeDouble işlevini kullanarak aşağıdaki sonuçları elde ederiz:
0.03999999999999999 = 0.04
0.036 = 0.04

İlk örnekte, gerçekten 0.04 değerini almanız gerekir, ancak ikincisinde - 0.03 (bu yüzden normal hesap makinesi düşünür).
NormalizeDouble kullanmak gereklidir, çünkü kesirler tam olarak dönmez, ancak ikinci durumda işlev yanlış değerler döndürür ve ilk seçenek için kullanmamak da imkansızdır.

 
Roman Starinskij :

Kesirlerin aşağıdaki bölme ve yuvarlama davranışı biraz belirsizdir.

2 denklem vardır:
0.06-0.02 = 0.03999999999999999
0.06-0.024 = 0.036

Önerilen NormalizeDouble işlevini kullanarak aşağıdaki sonuçları elde ederiz:
0.03999999999999999 = 0.04
0.036 = 0.04

İlk örnekte, gerçekten 0.04 değerini almanız gerekir, ancak ikincisinde - 0.03 (bu yüzden normal hesap makinesi düşünür).
Kesirler tam olarak döndürülmediği için NormalizeDouble kullanmak gerekir, ancak ikinci durumda işlev yanlış değerler döndürür ve ilk seçenek için kullanmamak da imkansızdır.

Her zamanki hesap makineniz doğru hesap yapmıyor, şöyle olmalı:

 
Slawa :
Topikstarter'ın dille ilgili belgeleri okumadığı ve söylediklerini dinlemediği gerçeğinden her şey

N+1 karakteri < 5 ise, N'inci karakter korunur ve N+1 ve sonraki tüm karakterler sıfıra ayarlanır;

N+1 işareti ≥ 5 ise, N'inci işaret bir artırılır ve N+1 ve sonraki tüm sıfırlar;

Üzgünüm, ama hala '2' ile yuvarlamanın neden hemen elde edilemediğini anlamıyorum = 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 :


Üzgünüm, ama hala '2' ile yuvarlamanın neden hemen elde edilemediğini anlamıyorum = 0.06000000


0,6'ya eşit olduğu için 0,5 sadece hile ile elde edilir.
 
lilita bogachkova :

Üzgünüm, ama hala '2' ile yuvarlamanın neden hemen elde edilemediğini anlamıyorum = 0.06000000


Yalnızca bir işaret normalleştirildiğinde, her şey basittir: 0, 1, 2, 3, 4 -> 0 ve 5, 6, 7, 8, 9 -> 1

İki basamak normalleştirilirse, iki basamaklı sayılar dikkate alınır: 0 - 49 -> 0 ve 50 - 99 -> 1. Sonuçta, eğer 1,49 sayısının tamsayılara yuvarlanması gerekiyorsa, o zaman gerçekten almaları gerekir. 2, 1'e olan mesafenin mevcut 49 yüzde birine karşı hangi 51 yüzde?

Üç basamaklı, dört basamaklı vb. ile aynı.