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

 

Bir zamanlar aşağıdan ve yukarıdan yuvarlama işlevleri yaptım

Belki biri yardım eder

 //+------------------------------------------------------------------+
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 :

Bir zamanlar aşağıdan ve yukarıdan yuvarlama işlevleri yaptım

Belki biri yardım eder

Teşekkürler, koleksiyonuma ekleyeceğim
 
lilita bogachkova :

0,999999999999999999 sonucunu almaya çalışın

X = 0,999999999999999999

10*X = 10*0.9999999999999999999

10*XX = 10*0.999999999999999999-0.999999999999999999

9*X = 9*0.9999999999999999999

9*X = 9 elde ederiz veya X 1 (bir) olur

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

veya 0,999999999999999999 = 1,0

v1 (1.00000000) >= 1.0

Bu durumda, 0.9999999999999999999999 1.0'ı temsil eder. Ancak görev "atılmalıdır", bu da sonucun dokuz olması gerektiği anlamına gelir.
 

Yardımcı konu için herkese teşekkürler!

Kendim için, NormalizeDouble aracılığıyla 1 basamak daha yuvarlama çözümünü seçtim ve ardından son basamağı kestim. Şimdiye kadar mükemmel uyuyor.

 

Ve yine yuvarlama hakkında ......

duruma göre söyleyin lütfen (domates atmayın ben hümanistim),

bu değişken var:

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

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

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

teorik olarak delta başlangıçta normalleştirilir,

OrderLots muhtemelen normalleştirilmiş çiftleri döndürmelidir,

ama bir şekilde bazen nadir durumlarda 2.775557561562891e-17 gibi sayılar alıyorum

yani neredeyse sıfır ama sıfır değil ......

İlk soru, bu normal mi?

ikinci soru - anladığım kadarıyla, ikinci normalleştirme kuyrukların görünmemesi için benim için yeterli olacak mı?

üçüncü soru (hâlâ anlamadığım bir önsezi var ama yine de soracağım):

Normalleştirilmiş iki sayı eklemek, normalleştirilmemiş verebilir mi?

Not: Bunu tekrar gündeme getirdiğim için özür dilerim, ancak tüm bunları tekrar okuyacak gücüm yok


 
transcendreamer :

Ve yine yuvarlama hakkında ......

duruma göre söyleyin lütfen (domates atmayın ben hümanistim),

bu değişken var:

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

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

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

teorik olarak delta başlangıçta normalleştirilir,

OrderLots muhtemelen normalleştirilmiş çiftleri döndürmelidir,

ama bir şekilde bazen nadir durumlarda 2.775557561562891e-17 gibi sayılar alıyorum

yani neredeyse sıfır ama sıfır değil ......

İlk soru, bu normal mi?

ikinci soru - anladığım kadarıyla, ikinci normalleştirme kuyrukların görünmemesi için benim için yeterli olacak mı?

üçüncü soru (hâlâ anlamadığım bir önsezi var ama yine de soracağım):

Normalleştirilmiş iki sayı eklemek, normalleştirilmemiş verebilir mi?

Not: Bunu tekrar gündeme getirdiğim için özür dilerim, ancak tüm bunları tekrar okuyacak gücüm yok

  1. Evet.
  2. Evet.
  3. Evet.
 
fxsaber :
  1. Evet.
  2. Evet.
  3. Evet.
Teşekkür ederim
 
transcendreamer :

Not: Bunu tekrar gündeme getirdiğim için özür dilerim, ancak tüm bunları tekrar okuyacak gücüm yok

Farklı örneklerle kendiniz kontrol etmenizde fayda var, bu bir anlayış sağlayacaktır.

Yanlış yaptığım tek şey:

 if (delta> 0 )

ve bu yüzden

 if (delta> 0.0 )

çiftler için. Bunun gerçekten önemli olup olmadığını bilmiyorum, ancak sürümüme göre hiç bir hatayla karşılaşmadım (sadece aynı tür değişkenleri karşılaştırmaya çalışıyorum).

 
Andrey Dik :

Bunun gerçekten önemli olup olmadığını bilmiyorum, ancak sürümüme göre hiç bir hatayla karşılaşmadım (yalnızca aynı tür değişkenleri karşılaştırmaya çalışıyorum).

sahip değil.
 
Ondalık olarak 1/3 gibi bazı sayılar yalnızca sonsuz bir kesir olarak gösterilebilir. Ancak 1/3, üçüncül sistemde == 0.1 olduğu sonsuz bir kesir değildir. Onlar. farklı sayı sistemlerinin kendi sonsuz kesirleri vardır. Bu nedenle, ondalık olarak sonsuz olmayan bir kesir ikili olarak böyle olabilir. Örneğin: 0.1, 0.2, 0.3, 0.4, ... tam bir ikili gösterime sahip değildir. NormalizeDouble'ı en az on kez arayın , ya 0.1999999999..1 ya da 0.20000...1 olacaktır. Haber mi bilmiyorum.