Dimensione della posizione che restituisce un valore negativo - pagina 3

 
JD4:

Quanto sopra era una risposta specifica al tuo post specifico"MathRound restituisce un doppio; numero infinito di posizioni decimali."

Ancora una volta, secondo la pagina della documentazione.

"Valore di ritorno

Valore arrotondato all'intero più vicino."

Ora, una risposta specifica a questa parte del tuo post.

"Quello che la pagina dice, è quello che fa. Arrotonda. Niente a che vedere con la questione dei decimali multipli."

Di nuovo, rileggi la citazione, dice che restituisce "Valore arrotondato fino al numero intero più vicino". Un numero intero, per definizione, è un numero intero, senza decimali. E ancora, se questo non è in realtà ciò che fa, allora il codice o la descrizione è rotto, e l'uno o l'altro o entrambi devono essere corretti da MQ, o altrimenti un'etichetta di avviso che indica che queste funzioni non funzionano come pubblicizzato.

Se effettivamente restituisce il tipo che gli viene dato, ma all'equivalente matematico del valore del numero intero più vicino (come in restituisce 1.00000 da un 1.23456, e 1 == 1.00000) ma non restituisce un tipo intero effettivo, allora la pagina di riferimento ha bisogno di specificare qualcosa come "non cambia il tipo di dati sottostante" o qualche altro modo che sia chiaramente indicato. Penso che questa sia stata una traduzione piatta dalla pagina originale russa, e come tale, non è chiara in inglese come dovrebbe essere.

La documentazione di MetaQuotes è debole nel migliore dei casi.

Comunque, detto questo, MathRound() restituisce un doppio per definizione:

Se il valore restituito leggesse: "Valore diviso per 2" sarebbe ancora un doppio.

Allo stesso modo in cui "Valore arrotondato all'intero più vicino" è ancora un doppio.

Spero che questo aiuti

 
honest_knave:

La documentazione di MetaQuotes è debole al massimo.

Tuttavia, detto questo, MathRound() restituisce un doppio per definizione:

Se il valore restituito leggesse: "Valore diviso per 2" sarebbe ancora un doppio.

Allo stesso modo in cui "Valore arrotondato all'intero più vicino" è ancora un doppio.

Spero che questo aiuti

Per me, "Valore arrotondato fino al numero intero più vicino" non è chiaro che restituisce qualcosa di diverso da un intero a causa della definizione di intero. Capisco che è effettivamente come funziona, ma questo ha sottolineato il mio punto che il codice e/o la formulazione della pagina ufficiale sono rotti e devono essere corretti. O il codice deve essere adattato in modo che restituisca un tipo int, o la formulazione della pagina deve essere modificata. Noi come utenti non abbiamo modo di farlo.Il valore che stai ottenendo il numero da arrotondare non cambia, a meno che tu non lo assegni di nuovo a quella variabile. Ad esempio, se stai arrotondando y con un valore di 1.3, e lo metti in x, usando la dicitura sopra, dopo che la funzione è finita, ti aspetteresti che y contenga ancora 1.3, e che x contenga 1, non 1.0. Nella mia mente, e come lo sto leggendo, arrotondare significa che si arrotonda all'elemento più vicino a cui si sta cercando di arrotondare, non un valore equivalente a quell'elemento. Forse la frase "qualcosa si perde nella traduzione" è molto appropriata qui.
 
JD4:
Per me, "Value rounded till to the nearest integer" non è chiaro che restituisce qualcosa di diverso da un intero a causa della definizione di intero. Capisco che è effettivamente come funziona, ma questo ha sottolineato il mio punto che il codice e/o la formulazione della pagina ufficiale è rotto e deve essere corretto. O il codice deve essere adattato in modo che restituisca un tipo int, o la formulazione della pagina deve essere cambiata. Noi come utenti non abbiamo modo di farlo.Il valore che stai ottenendo il numero da arrotondare non cambia, a meno che tu non lo assegni di nuovo a quella variabile. Ad esempio, se stai arrotondando y con un valore di 1.3, e lo metti in x, usando la dicitura sopra, dopo che la funzione è finita, ti aspetteresti che y contenga ancora 1.3, e che x contenga 1, non 1.0. Nella mia mente, e come lo sto leggendo, arrotondare significa che si arrotonda all'elemento più vicino a cui si sta cercando di arrotondare, non un valore equivalente a quell'elemento. Forse la frase "qualcosa si perde nella traduzione" è molto appropriata qui.

Non sono un fan della documentazione, ma devo dire che penso che siano stati coerenti in questo senso. Tutta la documentazione elenca il tipo di dati restituito (int, double, bool ecc.) all'inizio della pagina, la sezione del valore restituito in seguito non ripete mai questo tipo di dati. Inoltre in questo caso stanno restituendo esattamente lo stesso tipo di dati che viene inserito.

In ogni caso, se stai usando la direttiva del compilatore #property strict dovresti ricevere un avvertimento:

 
honest_knave:

Non sono un fan della documentazione, ma devo dire che penso che siano stati coerenti in questo senso. Tutta la documentazione elenca il tipo di dati restituito (int, double, bool ecc.) all'inizio della pagina, la sezione del valore restituito in seguito non ripete mai questo tipo di dati. Inoltre in questo caso stanno restituendo esattamente lo stesso tipo di dati che viene inserito.

In ogni caso, se stai usando la direttiva del compilatore #property strict dovresti ricevere un avviso:


Ho iniziato un thread sul forum di MQL5.com all'indirizzo https://www.mql5.com/en/forum/61394 che si spera possa aiutare questo problema di documentazione. Forse se ci sono abbastanza persone dietro l'idea, MQ ci permetterà di aiutare tutti a risolvere quello che fino ad ora è stato un problema per molte persone. Spero che MQ sia d'accordo con questa idea, perché noi come utenti non possiamo cambiare nulla.

@ knave & WH - Sono pienamente d'accordo con i vostri esempi, ma continuo a vedere un problema qui, che o non sto spiegando chiaramente, o sono una delle poche persone che stanno vedendo questo come un problema. Per me, i vostri esempi stanno dimostrando il mio lato di questo argomento più di quanto voi pensiate stiano dimostrando il vostro lato.

Fante, il tuo esempio restituirà un errore perché non sta restituendo il tipo di dati che dovrebbe restituire, un int. Il fatto che tu stia lanciando la tua variabile come un int rende solo più facile vedere il problema con la funzione che non funziona correttamente.

WH, tu indichi quella linea (dalla pagina del documento) e sta dicendo fondamentalmente la stessa cosa della linea che sto evidenziando. L'esempio usa solo un doppio come valore che viene inviato alla funzione. Nessuno dei tuoi post mostra che affermano al 100% in modo chiaro che il tipo di dati restituito dalla funzione è un doppio, solo che l'esempio sta inviando un doppio.

L'arrotondamento è generalmente accettato per cambiare il valore di un numero specifico in una precisione inferiore. Penso che su questo siamo tutti d'accordo.

In questo caso, non è diverso. La pagina specifica "arrotondato al più vicino intero del valore numerico specificato". Si legge che arrotonderà ad una precisione minore (int) di un altro valore. Nell'esempio usato, viene inviato un doppio. Questo è tutto ciò che è chiaro al 100%.

 

Mi dispiace JD4, mi hai completamente perso...

JD4:

Nessuno dei tuoi post mostra che dichiari al 100% in modo chiaro che il tipo di dati restituito dalla funzione è un doppio, solo che l'esempio sta inviando un doppio.

Questo è esattamente ciò che ho segnato con una freccia. Restituisce un doppio (grande freccia rossa) e anche il parametro passato è un doppio (sotto la mia freccia). Date un'occhiata a qualsiasi funzione. OrderSend() restituisce un int... OrderClose( ) restituisce un bool.... e MathRound() restituisce un doppio

JD4:

fante, il tuo esempio restituirà un errore perché non sta restituendo il tipo di dati che dovrebbe restituire, un int. Il fatto che tu stia lanciando la tua variabile come un int rende solo più facile vedere il problema con la funzione che non funziona correttamente.

La funzione funziona esattamente come pubblicizzato.

Se pensate che sia un int (sbagliato), ottenete questo:

Se lo si digita come un int, si riconosce che si sta usando il tipo di dati sbagliato:

Se lo trattate come un doppio (che è), non avete nessun avvertimento:

 
honest_knave:

Mi dispiace JD4, mi hai completamente perso...

Questo è esattamente quello che ho segnato con una freccia. Restituisce un doppio (grande freccia rossa) e il parametro passato è anch'esso un doppio (sotto la mia freccia). Date un'occhiata a qualsiasi funzione. OrderSend() restituisce un int... OrderClose( ) restituisce un bool.... e MathRound() restituisce un doppio

La funzione funziona esattamente come pubblicizzato.

Se pensate che sia un int (sbagliato), ottenete questo:


Se lo si digita come un int, si riconosce che si sta usando il tipo di dati sbagliato:


Se lo trattate come un doppio (che è), non avete nessun avvertimento:

Nel tuo esempio di codice di int RoundedNumber, stai facendo il type casting per restituire un int come tipo di ritorno. Questo non dovrebbe essere necessario perché si suppone che restituisca un int, in base a ciò che ti dice la pagina. La linea in alto e quella del valore di ritorno dicono che arrotonda a un intero del valore specificato.Un intero, non importa quante volte diciamo diversamente, non ha decimali, frazioni o qualsiasi altro modo di rappresentare i numeri tra i numeri interi, lo zero e i numeri interi negativi. Come l'esempio che ho postato sopra, in base alla documentazione fornita, inviando la funzione MathRound "1.3" dovrebbe restituire "1", non "1.0", poiché "1.0" non è un intero, ma "1" sì. (le virgolette servono solo per chiarire)

Il tipocasting come un int mostra un errore perché la funzione sottostante opera in contrasto con quello che la pagina dice di fare, non perché si suppone che restituisca qualcosa di diverso da un int. Se lo trattate come un doppio (che potrebbe essere ma non si suppone che sia), allora questo è solo lasciare che la funzione errata continui ad operare in contrasto con quello che è documentato che faccia, restituire un intero che è stato arrotondato dal valore inviato ad essa, che è un doppio.

Mandare un doppio per essere arrotondato (il modo in cui il codice è documentato ora) ad un intero e poi fondere o memorizzare il valore restituito in un tipo doppio non genererà errori perché si suppone che restituisca un int, e se si memorizza un int in un doppio, non si sta perdendo alcuna precisione nella conversione.Gli errori sono lì per notificare al programmatore la potenziale perdita di precisione nei calcoli. Se si memorizza un doppio in un int, ci si aspetta un errore come quello che stai mostrando perché lo stai forzando in un'altra forma con meno precisione di quella che aveva prima.

Se la funzione MathRound non deve restituire un int, allora la dicitura nella pagina deve essere cambiata in modo che non dica che deve restituire un int. Il mio problema non è mai stato con la funzione che fa qualcosa di diverso da quello che fa, se non che è in contrasto con quello che la pagina dice che dovrebbe fare.Devono correggere il codice della funzione in modo che restituisca un int come dice la pagina del documento, o modificare la pagina del documento per riflettere che non restituisce necessariamente un int. "Arrotondato al più vicino intero" è esattamente questo, un intero.

Modifica: ho fatto ulteriori ricerche sia attraverso i riferimenti C++ che Java, dato che MQL è in qualche modo basato su C++, ed è sintatticamente simile a Java e C++. C++ mostra in una parte del documento(http://www.cplusplus.com/reference/cmath/round/)"Round to nearest Restituisce il valore integrale che è più vicino a x, con i mezzi casi arrotondati a zero." Ma più avanti nella pagina dice"Return Value Il valore di x arrotondato all'integrale più vicino (come valore in virgola mobile)."Potreste dire che questo supporta il vostro punto di vista su questo, quando in realtà non lo fa, perché il C++ specifica che restituisce un float. La documentazione Java a http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html mostra quanto segue sui 2 metodi chiamati round. Entrambi (Java e C++) sono funzionalmente equivalenti all'interno dei loro linguaggi alle funzioni MathRound e/o round in MQL.

statico lungo round(double a)
Restituisce il long più vicino all'argomento, con legami arrotondati per eccesso.
int statico round(float a)
Restituisce l'int più vicino all'argomento, con arrotondamento per eccesso.
 

MQL MathRound restituisce un valore intero in un tipo di dati float. Sicuramente ciò che fanno le funzioni di arrotondamento C++ o Java è irrilevante. È banale scrivere la propria funzione 'int round(double a)' in MQL se ne volete una.

I float (32 bit) possono contenere interi (16 bit) senza perdita di precisione. Il problema è che OP vuole un valore arrotondato a due cifre decimali e si aspetta che sia esatto. Non lo sarà.

 
ydrol:

MQL MathRound restituisce un valore intero in un tipo di dati float. Sicuramente ciò che fanno le funzioni di arrotondamento C++ o Java è irrilevante. È banale scrivere la propria funzione 'int round(double a)' in MQL se ne volete una.

I float (32 bit) possono contenere interi (16 bit) senza perdita di precisione. Il problema è che OP vuole un valore arrotondato a due cifre decimali e si aspetta che sia esatto. Non lo sarà.

Sono andato fuori tema con i miei post che riguardavano specificamente la funzione che opera in un certo modo, e ho finito di postare quella discussione fuori tema. Se questa discussione sulla funzione finisce per spostarsi da qualche altra parte, mi sta bene.

Edit: ho iniziato un thread per continuare la discussione su questa pagina di doc in conflitto su https://www.mql5.com/en/forum/156174. Gum, ho risposto al tuo post qui sotto su quel thread.
 

JD4, sembra che tu sia l'unica persona confusa da questo

HonestKnave ha fatto notare che la documentazione mostra chiaramente che la funzione restituisce un doppio. Un intero rappresentato come un doppio.

"arrotondato al numero intero più vicino" non significa che viene convertito in un numero intero

Se vi dico di tagliare un pezzo di legno alla stessa lunghezza di un pezzo di corda. Il legno rimane ancora legno, non si trasforma improvvisamente in un pezzo di corda.

 
JD4:

La linea in alto e quella nel valore di ritorno dice che arrotonda a un intero del valore specificato.

JD4:

Se vuoi che il codice della funzione sia corretto in modo che restituisca un int come dice la pagina del documento, o che modifichi la pagina del documento per riflettere che non restituisce necessariamente un int. "Arrotondato al più vicino intero" è esattamente questo, un intero.


Beh, non sono sicuro di cosa ti convincerà JD4. La documentazione afferma chiaramente, al 100%, che la funzione restituisce un doppio. Tu stai leggendo qualcos'altro nella descrizione del valore restituito - non dice mai che restituisce un intero.

Quando guardi OrderSend() dice "Valore restituito: Restituisce il numero del biglietto assegnato all'ordine dal server commerciale o -1 se fallisce. Per ottenere ulteriori informazioni sugli errori, si deve chiamare la funzione GetLastError()".

Quindi cosa si intende per numero? È un po' vago, non credi? Intendono double? float? char? short? int? long? La risposta si trova nella parte superiore della pagina, come quella grande freccia che ho postato prima. Quello è il loro formato standard per dove si guarda per vedere il tipo di dati restituito. (nota che non ho detto valore di dati restituito). Non riesco davvero a pensare a un singolo esempio nella documentazione in cui la sezione "valore restituito" menzioni mai il tipo di dati.

Motivazione: