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

 
Алексей Тарабанов :
Şeytan kandırdı ... 2.6, elbette.
millet, yatma vakti
 
lilita bogachkova :
millet, yatma vakti
katılıyorum
 
Dmitry Fedoseev :
5 nedir? Böyle bir sayıyı normalleştirirken, tüm 9'lar sıfıra dönüşür, bu nedenle normalleştirme ve ardından atma yanlış sonuçlar verir.
DoubleToString (0.99999.5)
 
Vasyl Nosal :
DoubleToString(0.99999.5)

Duc, ve sayı 0,99999 ise ve iki karakter bırakmanız gerekiyorsa? Gerisini atın. 0,99 almanız gerekiyor. Böylece, daha önce önerilen algoritmaya göre, üç basamağa normalleştiririz, 1.000 alırız, birini atarız ve 1.00 alırız, ancak 0.99 olmaz.

 
Dmitry Fedoseev :

Duc, ve sayı 0,99999 ise ve iki karakter bırakmanız gerekiyorsa? Gerisini atın. 0,99 almanız gerekiyor. Böylece, daha önce önerilen algoritmaya göre, üç basamağa normalleştiririz, 1.000 alırız, birini atarız ve 1.00 alırız, ancak 0.99 olmaz.

 extern ushort Characters_delete = 3 ;

///////////////////////////////////////////
string data= DoubleToString ( 0.99999 , 5 ); 
string resoult= StringSubstr (data, 0 , StringLen (data)-Characters_delete);
 
Vasyl Nosal :
Evet... ve kesin olarak 0,99999 yerine 0,999999 numaramız vardı.
 
Dmitry Fedoseev :
Evet... ve kesin olarak 0,99999 yerine 0,999999 numaramız vardı.
 string ( 0.999999 )
 
Bana kayıp bir programcıyla ilgili bir şakayı hatırlattı. Ve soğuk bir banyoda, "sabun, durula, tekrarla" talimatlarıyla bir şampuanın elinde oturuyor.
 
Dmitry Fedoseev :
Bana kayıp bir programcıyla ilgili bir şakayı hatırlattı. Ve soğuk bir banyoda, "sabun, durula, tekrarla" talimatlarıyla bir şampuanın elinde oturuyor.
Dilin neden böyle bir kesinliğe ihtiyacı var: (örneğin) "0.7" sayısı aslında "0.69999 ..." olarak saklanıyor?
Gerçekten bir yerde kullanılıyor mu? Hesap makinesindeki gibi sayıları saymaya alışığım, tam olarak orayı gösteriyor.
Evet, hesap makinesinin kendi başına bir şey yuvarlaması ve tam sayıları kaydetmemesi mümkündür ...
Kesin değerler yerine sonsuz kesirli bu tür yaklaşık sayıları kim kullanmaya ihtiyaç duyar ki?
Bölündü, 0,7 oldu ve kırpma veya yuvarlama ile uğraşmayın :-)
 
Dmitry Fedoseev :

Peki ya sayı 0,99999 ise ve iki karakter bırakmanız gerekiyorsa? Gerisini atın. 0,99 almanız gerekiyor. Böylece, daha önce önerilen algoritmaya göre, üç basamağa normalleştiririz, 1.000 alırız, birini atarız ve 1.00 alırız, ancak 0.99 olmaz.

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

 void OnStart ()
  {
       double v1= 1.0 / 3.0 ;
       double v2= 3.0 *v1;

       Print ( "v1 = (1/3) = " , DoubleToString (v1), " | " , "v2 = 3*(1/3) = " , DoubleToString (v2));
  }

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

veya 0,999999999999999999 = 1,0

 void OnStart ()
  {
       double v1= 0.99999999999999999 ;

       if ( v1 >=1.0)
         Print ( "v1 (" , DoubleToString (v1), ") >= 1.0" );
  }

v1 (1.00000000) >= 1.0