Negatif Değer Döndüren Konum Boyutu - sayfa 3

 
JD4 :

Yukarıdakiler, " MathRound bir çift; sonsuz sayıda ondalık basamak döndürür" yazınıza özel bir yanıttı.

Bir kez daha, dokümantasyon sayfasına göre.

" Dönüş Değeri

Değer, en yakın tam sayıya yuvarlanır. "

Şimdi, gönderinizin bu bölümüne özel bir yanıt.

" Sayfanın söylediği, yaptığı şeydir. Yuvarlanır. Birden çok ondalık basamak sorusuyla ilgisi yok. "

Tekrar, alıntıyı tekrar okuyun, "En yakın tam sayıya yuvarlanmış değer" döndürdüğünü söylüyor. Bir tamsayı, tanımı gereği, ondalık basamağı olmayan bir tam sayıdır. Ve yine, gerçekte yaptığı şey bu değilse, o zaman kod veya açıklama bozulur ve birinin veya diğerinin veya her ikisinin de MQ tarafından düzeltilmesi veya bu işlevlerin gerektiği gibi çalışmadığını belirten bir uyarı etiketi gerekir. reklamı yapıldı.

Aslında kendisine verilen türü döndürürse, ancak en yakın tamsayı değerine matematiksel eşdeğerde (1.23456'dan 1.00000 ve 1 == 1.000000 döndürürde olduğu gibi) ancak gerçek bir tamsayı türü döndürmezse, referans sayfasının "Temel veri türünü değiştirmez" gibi bir şey veya açıkça belirtilen başka bir yol belirtin. Bence bu, orijinal Rusça sayfadan düz bir çeviriydi ve bu nedenle İngilizce olması gerektiği kadar net değil.

MetaQuotes belgeleri en iyi ihtimalle zayıftır.

Bununla birlikte, MathRound() tanımı gereği bir double döndürür:

Döndürülen değer şunu okursa: "Değer bölü 2", yine de bir çift olacaktır.

Aynı şekilde "En yakın tam sayıya yuvarlanan değer" hala bir çifttir.

umarım yardımcı olur

 
honest_knave :

MetaQuotes belgeleri en iyi ihtimalle zayıftır.

Bununla birlikte, MathRound() tanım gereği bir double döndürür:

Döndürülen değer okursa: "Değer bölü 2", yine de bir çift olacaktır.

Aynı şekilde "En yakın tam sayıya yuvarlanan değer" hala bir çifttir.

umarım yardımcı olur

Bana göre, "En yakın tam sayıya yuvarlanan değer", tamsayı tanımı nedeniyle bir tamsayı dışında bir şey döndürdüğü açık değildir. Aslında nasıl çalıştığını anlıyorum, ancak bu, kodun ve/veya resmi sayfa ifadesinin bozuk olduğu ve düzeltilmesi gerektiği konusundaki noktamı vurguladı. Ya kodun bir int türü döndürecek şekilde ayarlanması ya da sayfa ifadesinin değiştirilmesi gerekiyor. Biz kullanıcılar olarak bunu yapma şansımız yok. Yuvarlanacak sayıyı elde ettiğiniz değer, o değişkene geri atamadığınız sürece değişmez. Örneğin, y'yi 1,3 değerinde yuvarlarsanız ve yukarıdaki ifadeyi kullanarak onu x'e yerleştirirseniz, işlev yapıldıktan sonra y'nin yine de 1.3 içermesini ve x'in 1.0 değil 1 içermesini beklersiniz. Aklımda ve nasıl okuduğumda, yuvarlama, yuvarlamaya çalıştığınız en yakın öğeye, o öğeye eşdeğer bir değere değil, yuvarlamanız anlamına gelir. Belki de "çeviri sırasında bir şey kaybolmuştur" ifadesi burada çok uygundur.
 
JD4 :
Bana göre, "En yakın tam sayıya yuvarlanan değer", tamsayı tanımı nedeniyle bir tamsayı dışında bir şey döndürdüğü açık değildir. Aslında nasıl çalıştığını anlıyorum, ancak bu, kodun ve/veya resmi sayfa ifadesinin bozuk olduğu ve düzeltilmesi gerektiği konusundaki noktamı vurguladı. Ya kodun bir int türü döndürecek şekilde ayarlanması ya da sayfa ifadesinin değiştirilmesi gerekiyor. Biz kullanıcılar olarak bunu yapma şansımız yok. Yuvarlanacak sayıyı elde ettiğiniz değer, o değişkene geri atamadığınız sürece değişmez. Örneğin, y'yi 1,3 değerinde yuvarlarsanız ve yukarıdaki ifadeyi kullanarak onu x'e yerleştirirseniz, işlev yapıldıktan sonra y'nin yine de 1.3 içermesini ve x'in 1.0 değil 1 içermesini beklersiniz. Aklımda ve nasıl okuduğumda, yuvarlama, yuvarlamaya çalıştığınız en yakın öğeye, o öğeye eşdeğer bir değere değil, yuvarlamanız anlamına gelir. Belki de "çeviri sırasında bir şey kaybolmuştur" ifadesi burada çok uygundur.

Belgelerin hayranı değilim, ancak bu konuda tutarlı olduklarını düşündüğümü söylemeliyim. Tüm belgeler sayfanın üst kısmında döndürülen veri türünü (int, double, bool vb.) listeler, daha sonra döndürülen değer bölümü bu veri türünü asla tekrar etmez. Artı bu durumda, girilen veri türünün tam olarak aynısını döndürüyorlar.

Her durumda, #property katı derleyici yönergesini kullanıyorsanız bir uyarı alıyor olmalısınız:

 
honest_knave :

Belgelerin hayranı değilim, ancak bu konuda tutarlı olduklarını düşündüğümü söylemeliyim. Tüm belgeler sayfanın üst kısmında döndürülen veri türünü (int, double, bool vb.) listeler, daha sonra döndürülen değer bölümü bu veri türünü asla tekrar etmez. Artı bu durumda, girilen veri türünün tam olarak aynısını döndürüyorlar.

Her durumda, #property katı derleyici yönergesini kullanıyorsanız bir uyarı alıyor olmalısınız:


Https://www.mql5.com/en/forum/61394 adresindeki MQL5.com forumunda, sonunda bu belgeleme sorununa yardımcı olacağını umduğum bir konu başlattım. Belki yeterince insanı bu fikrin arkasına alırsak, MQ şimdiye kadar birçok insan için sorun olan şeyi düzeltmemize yardımcı olur. Umarım MQ bu fikre katılır, çünkü biz kullanıcılar hiçbir şeyi değiştiremeyiz.

@ knave & WH - Örneklerinize tüm kalbimle katılıyorum, ancak yine de burada bir sorun görüyorum, ya tam olarak açıklayamıyorum ya da bunu sorun olarak gören birkaç kişiden biriyim. Bana göre, verdiğin örnekler bu konuda senin tarafını kanıtladığını düşündüğünden daha fazla benim tarafımı kanıtlıyor.

knave, örneğiniz bir hata döndürür çünkü döndürmesi gereken veri türünü, bir int'yi döndürmez. Değişkeninizi int olarak yayınlamanız, işlevin düzgün çalışmamasıyla ilgili sorunu görmeyi kolaylaştırır.

WH, o satırı işaret ediyorsun (belge sayfasından) ve temelde vurguladığım satırla aynı şeyi söylüyor. Örnek, işleve gönderilen değer olarak yalnızca bir çift kullanır. Gönderilerinizin hiçbiri, işlevden döndürülen veri türünün bir çift olduğunu, yalnızca örneğin bir çift gönderdiğini %100 kesin olarak açıkça göstermiyor.

Yuvarlama genellikle belirli bir sayının değerini daha düşük bir kesinliğe değiştirmek için kabul edilir. Sanırım bu konuda hepimiz hemfikiriz.

Bu durumda da durum farklı değil. Sayfa, "belirtilen sayısal değerin en yakın tamsayısına yuvarlanmış" ifadesini belirtir. Başka bir değerden daha düşük bir kesinliğe (int) yuvarlayacağını okur. Kullanılan örnekte bir double gönderilmektedir. %100 net olan tek şey bu.

 

Üzgünüm JD4, beni tamamen kaybettin...

JD4 :

Gönderilerinizin hiçbiri, işlevden döndürülen veri türünün bir çift olduğunu, yalnızca örneğin bir çift gönderdiğini %100 kesin olarak açıkça göstermiyor.

Okla işaretlediğim şey tam olarak buydu. Bir çift (büyük kırmızı ok) döndürür ve iletilen parametre de bir çifttir (okumun altında). Herhangi bir fonksiyona bir göz atın. OrderSend() bir int döndürür ... OrderClose() bir bool .... döndürür ve MathRound() bir double döndürür

JD4 :

knave, örneğiniz bir hata döndürür çünkü döndürmesi gereken veri türünü, bir int'yi döndürmez. Değişkeninizi int olarak yayınlamanız, işlevin düzgün çalışmamasıyla ilgili sorunu görmeyi kolaylaştırır.

İşlev tam olarak ilan edildiği gibi çalışıyor.

Bunun bir int (yanlış) olduğunu düşünüyorsanız, şunu alırsınız:

Bunu int olarak yazarsanız, yanlış veri türünü kullandığınızı kabul edersiniz:

Eğer ona bir çift gibi davranırsanız (ki öyledir), hiçbir uyarınız olmaz:

 
honest_knave :

Üzgünüm JD4, beni tamamen kaybettin...

Okla işaretlediğim şey tam olarak buydu. Bir çift (büyük kırmızı ok) döndürür ve iletilen parametre de bir çifttir (okumun altında). Herhangi bir fonksiyona bir göz atın. OrderSend() bir int döndürür ... OrderClose() bir bool .... döndürür ve MathRound() bir double döndürür

İşlev tam olarak ilan edildiği gibi çalışıyor.

Bunun bir int (yanlış) olduğunu düşünüyorsanız, şunu alırsınız:


Bunu int olarak yazarsanız, yanlış veri türünü kullandığınızı kabul edersiniz:


Eğer ona bir çift gibi davranırsanız (ki öyledir), hiçbir uyarınız olmaz:

Örnek, bir double döndürmek için typecasting. int RoundedNumber kod örneğinizde, dönüş türü olarak bir int döndürmek için cast yazıyorsunuz. Sayfanın size söylediklerine bağlı olarak bir int döndürmesi gerektiği için bu gerekli olmamalıdır. En üstteki satır ve dönüş değerindeki satır, belirtilen değerin bir tamsayısına yuvarlandığını söylüyor. Bir tamsayı, kaç kez farklı söylersek söyleyelim, ondalık basamağa, kesre veya tam sayılar, sıfır ve negatif tam sayılar arasındaki sayıları temsil etmenin başka bir yoluna sahip değildir. Yukarıda gönderdiğim örnekte, verilen belgelere dayanarak, MathRound işlevinin "1.3" gönderilmesi "1.0" değil, "1" döndürmelidir, çünkü "1.0" bir tamsayı değil, "1"dir. (sadece açıklama amaçlı alıntılar)

Bunu bir int olarak yazmak bir hata gösterir, çünkü temel işlev, sayfanın söylediği şeye karşı çalışır, bir int dışında dönmesi gerektiği için değil. Bunu bir çift olarak ele alırsanız (ki olabilir, ancak olması gerekmez), o zaman bu sadece yanlış işlevin belgelendiği şeye karşı çalışmaya devam etmesine izin vermektir, gönderilen değerden yuvarlanmış bir tamsayı döndürün. ona, ki bu bir çifttir.

Bir tamsayıya yuvarlanacak bir çift göndermek (kodun şimdi belgelenme şekli) ve ardından döndürülen değeri bir çift türe dökmek veya depolamak, bir int döndürmesi gerektiği için ve bir int depolarsanız, hata oluşturmaz. iki katına, dönüşümde herhangi bir hassasiyet kaybetmezsiniz. Hatalar, programcıyı hesaplamalardaki olası hassasiyet kaybı hakkında bilgilendirmek için vardır. Bir int içine bir double depolarsanız, gösterdiğiniz gibi bir hata beklersiniz çünkü onu öncekinden daha az hassasiyetle başka bir forma zorluyorsunuz.

MathRound işlevinin bir int döndürmesi gerekmiyorsa, sayfadaki ifadenin bir int döndürmesi gerektiğini söylememesi için değiştirilmesi gerekir. Benim sorunum, işlevin yaptığından farklı bir şey yapmasıyla hiç olmadı, sayfanın yapması gerektiğini söylediği şeye aykırı olması dışında. Belge sayfasının söylediği gibi bir int döndürmesi için işlevin kodunu düzeltmeleri veya belge sayfasını mutlaka bir int döndürmediğini yansıtacak şekilde düzenlemeleri gerekir. "En yakın tam sayıya yuvarlanmış" tam olarak budur, bir tamsayıdır.

Düzenleme: MQL biraz C++'a dayalı olduğundan ve sözdizimsel olarak Java ve C++'a benzediğinden, hem C++ hem de Java referansları aracılığıyla daha fazla araştırma yaptım. Belgenin bir bölümünde C++ gösterilir ( http://www.cplusplus.com/reference/cmath/round/ ) " En yakına yuvarla, yarım durum sıfırdan uzağa yuvarlanmış olarak, x'e en yakın integral değeri döndürür." Ancak daha sonra sayfada " Dönüş Değeri x'in değeri en yakın integrale yuvarlanmış (kayan nokta değeri olarak)" yazıyor. Bunun, bu konudaki görüşünüzü desteklediğini söyleyebilirsiniz, ancak aslında desteklemez, çünkü C++ bir kayan nokta döndürdüğünü belirtir. http://docs.Oracle.com/javase/7/docs/api/java/lang/Math.html adresindeki Java belgeleri, round adlı 2 yöntemde aşağıdakileri gösterir. Her ikisi de (Java ve C++), dillerinde MQL'deki MathRound ve/veya yuvarlak işlevlere işlevsel olarak eşdeğerdir.

statik uzun yuvarlak (çift a)
Bağların yuvarlanmasıyla bağımsız değişkene en yakın uzunluğu döndürür.
statik int yuvarlak (yüzer a)
Bağların yuvarlanmasıyla bağımsız değişkene en yakın int değerini döndürür.
 

MQL MathRound, bir kayan nokta veri tipinde bir tamsayı değeri döndürür. Elbette C++ veya Java yuvarlama işlevlerinin ne yaptığı önemsizdir. İsterseniz MQL'de kendi 'int round(double a)' işlevinizi yazmak önemsizdir.

(32bit)şamandıralar (16 bit)tamsayıları hassasiyet kaybı olmadan gayet iyi tutabilir. Sorun, OP'nin iki ondalık basamağa yuvarlanmış değer istemesi ve kesin olmasını beklemesidir. olmayacak.

 
ydrol :

MQL MathRound, bir kayan nokta veri tipinde bir tamsayı değeri döndürür. Elbette C++ veya Java yuvarlama işlevlerinin ne yaptığı önemsizdir. İsterseniz MQL'de kendi 'int round(double a)' işlevinizi yazmak önemsizdir.

(32bit)şamandıralar (16 bit)tamsayıları hassasiyet kaybı olmadan gayet iyi tutabilir. Sorun, OP'nin iki ondalık basamağa yuvarlanmış değer istemesi ve kesin olmasını beklemesidir. olmayacak.

Gönderilerimin özellikle belirli bir şekilde çalışan işlevle ilgili olmasıyla konudan çıktım ve bu konu dışı konu tartışmasını yayınlamayı bitirdim. Bu işlev tartışması başka bir yere taşınırsa, bununla iyiyim.

Düzenleme: Bu çelişkili belge sayfasının devam eden tartışması için https://www.mql5.com/en/forum/156174 adresinde bir ileti dizisi başlattım. Gum, bu konudaki aşağıdaki yazınıza cevap verdim.
 

JD4, bununla kafası karışan tek kişi gibi görünüyorsun

HonestKnave, belgelerin işlevin bir çift döndürdüğünü açıkça gösterdiğine dikkat çekti. Çift olarak temsil edilen bir tam sayı.

"en yakın tam sayıya yuvarlanmış" tam sayıya dönüştürüldüğü anlamına gelmez

Size bir ip parçasıyla aynı uzunlukta bir tahta parçası kesmenizi söylersem. Odun hala odun olarak kalır, aniden bir ip parçasına dönüşmez.

 
JD4 :

En üstteki satır ve dönüş değerindeki satır, belirtilen değerin bir tamsayısına yuvarlandığını söylüyor.

JD4 :

doc sayfasının söylediği gibi bir int döndürmesi için işlevin kodunu düzeltmeniz veya doc sayfasını mutlaka bir int döndürmediğini yansıtacak şekilde düzenlemeniz gerekir. "En yakın tam sayıya yuvarlanmış" tam olarak budur, bir tamsayıdır.


Seni neyin ikna edeceğinden emin değilim JD4. Belgeler açıkça, %100 işlevin bir çift döndürdüğünü belirtir. Döndürülen değerin açıklamasına başka bir şey okuyorsunuz - hiçbir zaman bir tamsayı döndürdüğünü belirtmez.

OrderSend()'e baktığınızda "İade edilen değer: İşlem sunucusu tarafından siparişe atanan biletin numarasını döndürür veya başarısız olursa -1 verir. Ek hata bilgisi almak için GetLastError() işlevini çağırmak gerekir."

Peki sayı ile ne anlama geliyor? Bu biraz belirsiz, sence de öyle değil mi? Çift mi demek istiyorlar? batmadan yüzmek? karakter? kısa boylu? int? uzun? Cevap, daha önce yayınladığım büyük ok gibi, sayfanın en üstünde yatıyor. Döndürülen veri türünü nerede göreceğinize ilişkin standart biçimi budur. (döndürülen veri değeri söylemediğimi unutmayın). Gerçekten "döndürülen değer" bölümünün veri türünden bahsettiği belgelerde tek bir örnek düşünemiyorum.