Dimensione della posizione che restituisce un valore negativo - pagina 2

 
NoLimitations:

Ho anche appena provato ad usarlo senza successo. È possibile che DTS cambi semplicemente la precisione di un valore per l'aspetto e non il valore effettivo? Non vedo altre opzioni.

Sì, penso che la stringa renda semplicemente il valore nel doppio una versione stampabile di esso, ma non lo cambia. Non sono sicuro di come farlo in MQL, ma so che in Java puoi forzare una conversione di tipo da un tipo a un altro (in questo caso, da doppio a int).

Dalla documentazione di oracle su http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html. Questa è solo una piccola parte del codice presentato.

// Casting conversion (5.4) of a float literal to
// type int. Without the cast operator, this would
// be a compile-time error, because this is a
// narrowing conversion (5.1.3):
int i = (int)12.5 f;
// String conversion (5.4) of i's int value:
System.out.println("(int)12.5f==" + i);

Nel tuo caso, credo che dovresti fargli dire qualcosa come

int intConvertedDouble = (int) valueYouGotItFrom;

Ovviamente dovresti aggiustare i nomi per adattarli meglio al tuo codice.

http://www.studytonight.com/java/type-casting-in-java lo copre anche lì. Dato che Java e MQL sono entrambi basati su C++, questo potrebbe aiutarvi.

 

@OP oltre a leggere tutti i link di MQL4 precedentemente postati vedi Working With Doubles e PrintFormat

@JD4 Non vedo come postare codice Java e fare riferimento alle specifiche Java aiuti l'OP. Anche Java e C++ sono simili, ma non sono d'accordo che sia basato su C++.

Anche se stai cercando di essere d'aiuto, penso che molte delle tue risposte quando non sei sicuro delle risposte stesse, portano solo a confondere le persone in cerca di aiuto.

 
ydrol:

@OP oltre a leggere tutti i link di MQL4 precedentemente postati vedi Working With Doubles e PrintFormat

@JD4 Non vedo come postare codice Java e fare riferimento alle specifiche Java aiuti l'OP. Anche Java e C++ sono simili, ma non sono d'accordo che sia basato su C++.

Anche se stai cercando di essere d'aiuto, penso che molte delle tue risposte quando non sei sicuro delle risposte stesse, portano solo a confondere le persone in cerca di aiuto.

Per quanto riguarda i tuoi pensieri C++, dai un'occhiata a https://www.mql5.com/en/docs/basis. Lo dice proprio lì, e dal momento che hanno modificato MQL4 per essere più simile a MQL5(https://docs.mql4.com/mql4changes), si applica anche qui. Per quanto riguarda la mia base di conoscenze, non ho mai affermato di essere un esperto, e faccio sapere alla gente che quando pubblico se non sono sicuro di qualcosa, almeno ci provo, potrebbe mancare a volte.Se guido una Chevy e ho problemi con essa, non ho intenzione di sedersi lì e sconto consigli da qualcuno che lavora solo su Fords se è un consiglio utile, anche se potrebbe non essere del tutto giusto sui soldi. io anche non sedersi lì e dire loro non credo che si può aiutare, se lo stanno facendo per cercare di essere utile.
 

Credo che tu abbia frainteso il mio post. Mql4 OO è certamente basato su C++. Non credo che ci sia da discutere su questo. Mi riferivo alla tua affermazione:

JD4: Since Java and MQL are both supposed to be based on C++, this might help you out.

seguito da molti riferimenti a Java. Ho detto -

ydrol: Anche Java e C++ sono simili, ma non sono d'accordo che sia basato su C++

Mi riferivo in particolare ai tuoi riferimenti a Java. Java non è basato su c++ secondo me.

In ogni caso l'argomento della rappresentazione dei decimali in virgola mobile è stato trattato più volte nei thread menzionati da WHRoeder prima.

Sembra che OP voglia arrotondare a due cifre decimali, ma senza postare alcun output o esempi specifici immagino che il grado di errore di arrotondamento che stanno vedendo possa essere ignorato.

 
JD4: Non secondo la pagina di documentazione per esso. https://docs.mql4.com/math/mathround
NoLimitations: JD4 ha ragione, la pagina doc dice che arrotonda al numero intero più vicino.

Entrambi sbagliati. Si arrotonda al numero intero più vicino. Irrilevante. Restituisce un doppio. 1 = 1.0 = 1.00 = 1.00000 = 1.000000000000000000000000000000000000 INFINITE CIFRE

Impara la virgola mobile. L'operando ==. - MQL4 forum



 

Immagino che WH abbia bisogno di tornare indietro e rileggere, stavo dicendo ciò che la pagina diceva che la funzione faceva, non ciò che effettivamente fa. E la programmazione informatica è uno dei pochi posti dove (int) 1 != (double) 1.00000000 (all'infinito) per quanto riguarda i tipi di dati.


@ ydrol, ho perso la direzione del tuo intento con la tua affermazione su MQL/Java/C++. Un po' di materiale di riferimento per te per dare un'occhiata all'origine di Java come linguaggio di programmazione.

https://en.wikipedia.org/wiki/Java_(linguaggio_di_programmazione)

http://www.freejavaguide.com/history.html

Dato che entrambi dicono quasi la stessa cosa riguardo al C++, posterò dal wiki. "Il linguaggio deriva gran parte della sua sintassi da C e C++, ma ha meno strutture di basso livello di entrambi".

 

Dalla stessa epoca"La sintassi di un linguaggio definisce la sua forma superficiale ". (parentesi graffe ecc.). Ciò di cui si sta discutendo in questo thread non è legato alla sintassi. La mia opinione è che dire "Java è basato su C++" nello stesso modo in cui lo è MQL, è un'affermazione molto più forte che non condivido.

Ma siccome è un'affermazione qualitativa possiamo avere ragione e torto allo stesso tempo. Ancora non vedo come le specifiche Java aiutino l'OP, quando ci sono dei link specifici già dati con il problema e questa non era una domanda relativa alla sintassi.

Entrambi gli articoli che citi, sottolineano che Java prende in prestito dalla sintassi - ma poco altro. Questo non è un problema legato alla sintassi.

Tuttavia è legato alla rappresentazione in virgola mobileIEEE 754 usata da MQL, che è anche condivisa dalle lingue. (e molti altri che non hanno una sintassi simile al c - ad esempio Pascal, o anche applicazioni come Excel) e questo è davvero perché è uno standard supportato dalla maggior parte delle CPU/FPU piuttosto che somiglianze sintattiche dei linguaggi. Il problema è la rappresentazione in virgola mobile delle frazioni decimali ha piccoli errori. L'OP vuole arrotondare a due cifre decimali. Il formato IEEE754 non può memorizzare accuratamente un decimo (0,1) né un centesimo (0,01). Nel formato binarioIEEE 754 queste sono frazioni binarie ricorrenti, (allo stesso modo che 1/3 è una frazione decimale ricorrente 0.33333... ) - La differenza tra il numero previsto e il numero reale è abbastanza piccola (ad esempio 0.00000000000001 ) ma è abbastanza grande in modo che

1/10 != 0.1 // probabilmente

E int(0.1 * 10) potrebbe arrotondare nel modo sbagliato

Ma come OP non ha postato esattamente ciò che stanno vedendo il miglior consiglio è stato dato molto indietro nel 3 ° post di questo argomento, andare a leggere i thread MQL. Non vedo il senso di suggerire loro di leggere anche le specifiche Java dopo che i thread MQL sono stati dati e probabilmente non hanno familiarità con Java.

Riassunto del thread:

  • OP: I numeri si comportano in modo strano
  • WHRoeader: Qui ci sono diversi link con diverse spiegazioni sul perché i punti fluttuanti sono strani. < La risposta è qui da qualche parte ...
  • OP: Ho capito, i numeri si comportano ancora in modo strano.
  • JD4: MQL4 e Java sono basati su C++, qui ci sono alcuni oscuri link Java su typecasting e promozione, che anche gli sviluppatori Java troverebbero una lettura difficile.
  • ydrol: In che modo questo aiuta OP esattamente? Non sono d'accordo che Java sia basato su C++ Le risposte sono state postate un po' di tempo fa...
  • ecc. ecc.

 
Ho postato il modo Java di convertire i tipi per 2 motivi: il primo è, dichiaratamente, perché ho più familiarità con Java; il secondo è che ho fatto una ricerca sul codice e, forse perché ero stanco quando l'ho fatto, non ho visto come farlo nei documenti di MQL. Quindi, per cercare di essere utile, ho suggerito una possibile soluzione che ero ragionevolmente sicuro avrebbe funzionato, basandomi sulla presunzione che MQL e Java sono abbastanza vicini, dato il loro confronto condiviso con un linguaggio comune, C++.
 
JD4: Immagino che WH abbia bisogno di tornare indietro e rileggere, stavo dicendo ciò che la pagina dice che la funzione ha fatto, non ciò che effettivamente fa.
  1. Forse dovresti tornare indietro e rileggere la domanda.
    NoLimitations: Perché dovrei ancora ottenere risposte con più decimali se sto usando MathRound()?
    Quello che la pagina dice, è quello che fa. Arrotonda. Niente a che fare con la domanda sui decimali multipli.
  2. I decimali multipli sono ciò che accade quando si stampa un doppio senza specificare il numero richiesto.
 
WHRoeder:
JD4: Immagino che WH abbia bisogno di tornare indietro e rileggere, stavo dicendo ciò che la pagina dice che la funzione ha fatto, non ciò che effettivamente fa.
  1. Forse dovresti tornare indietro e rileggere la domanda.
    NoLimitations: Perché dovrei ancora ottenere risposte con più decimali se sto usando MathRound()?
    Quello che la pagina dice, è quello che fa. Arrotonda. Niente a che fare con la domanda sui decimali multipli.
  2. I decimali multipli sono ciò che accade quando si stampa un doppio senza specificare il numero richiesto.

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, come in nessun decimale. 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 afferma che queste funzioni non funzionano come pubblicizzato.

Se effettivamente restituisce il tipo che gli viene dato, ma all'equivalente matematico del valore 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 deve 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.

Motivazione: