El tamaño de la posición devuelve un valor negativo - página 2

 
NoLimitations:

También acabo de intentar usar esto sin éxito. ¿Posiblemente DTS simplemente cambia la precisión de un valor para la apariencia y no el valor real? No veo ninguna otra opción.

Sí, creo que la cadena sólo hace que el valor en el doble una versión imprimible de la misma, pero no lo cambia. No estoy seguro de cómo hacerlo en MQL, pero sé que en Java puede forzar una conversión de tipo de un tipo a otro (en este caso, doble a int).

De los documentos de Oracle en http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html. Esto es sólo una pequeña parte del código presentado.

// 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);

En tu caso, creo que deberías hacer que diga algo como

int intConvertedDouble = (int) valueYouGotItFrom;

Obviamente tendrías que ajustar los nombres para que se ajusten mejor a tu código.

http://www.studytonight.com/java/type-casting-in-java también lo cubre allí. Dado que Java y MQL se supone que ambos se basan en C ++, esto podría ayudarle a cabo.

 

@OP además de leer todos los enlaces de MQL4 publicados anteriormente ver Working With Doubles y PrintFormat

@JD4 No veo cómo la publicación de código Java y haciendo referencia a las especificaciones de Java ayuda a la OP. También Java y C ++ son similares, pero no estoy de acuerdo que se basa en C ++

Aunque tratas de ser útil, creo que muchas de tus respuestas, cuando no estás seguro de las respuestas, sólo llevan a confundir a la gente que busca ayuda.

 
ydrol:

@OP además de leer todos los enlaces de MQL4 publicados anteriormente ver Working With Doubles y PrintFormat

@JD4 No veo cómo la publicación de código Java y haciendo referencia a las especificaciones de Java ayuda a la OP. También Java y C ++ son similares, pero no estoy de acuerdo que se basa en C ++

Aunque tratas de ser útil, creo que muchas de tus respuestas, cuando no estás seguro de las respuestas, sólo llevan a confundir a la gente que busca ayuda.

En cuanto a sus pensamientos de C ++, echa un vistazo a https://www.mql5.com/en/docs/basis. Lo dice allí, y desde que se modificó MQL4 a ser más como MQL5(https://docs.mql4.com/mql4changes), se aplica aquí también. En cuanto a mi base de conocimientos, nunca pretendió ser un experto, y dejo que la gente sabe que cuando publico si no estoy seguro de algo, al menos lo intento, puede fallar a veces.Si conduzco un Chevy, y estoy teniendo problemas con él, no voy a sentarse allí y el consejo de descuento de alguien que sólo trabaja en Fords si es un consejo útil, incluso si no puede ser del todo en el dinero. Tampoco voy a sentarse allí y decirles que no creo que pueda ayudar, si lo están haciendo para tratar de ser útil.
 

Creo que has interpretado mal mi post. El OO de Mql4 está ciertamente basado en c++, no creo que eso se pueda discutir. Me refería a tu afirmación

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

seguido de un montón de referencias a Java. He dicho...

ydrol: También Java y C ++ son similares, pero no estoy de acuerdo que se basa en C ++

Me refería concretamente a tus referencias a Java. Java no está basado en c++ en mi opinión.

En cualquier caso el tema de la representación de decimales en coma flotante ha sido tratado varias veces en los hilos mencionados por WHRoeder anteriormente.

Parece que el OP quiere redondear a dos decimales, pero sin publicar ninguna salida o ejemplos específicos supongo que el grado de error de redondeo que están viendo puede ser ignorado.

 
JD4: No según la página de documentación de la misma. https://docs.mql4.com/math/mathround
NoLimitations: JD4 tiene razón, la página doc dice que redondea al entero más cercano.

Ambas cosas son erróneas. Se redondea al número entero más cercano. Irrelevante. Devuelve un doble. 1 = 1.0 = 1.00 = 1.00000 = 1.00000000000000000000000000 DÍGITOS INFINITOS

Aprende sobre el punto flotante. El operando ==. - Foro MQL4



 

La programación de computadoras es uno de los pocos lugares donde (int) 1 != (double) 1.00000000 (ad infinitum) en lo que respecta a los tipos de datos.


@ ydrol, me perdí la dirección de su intención con su declaración re MQL / Java / C ++. Algunos materiales de referencia para que usted pueda echar un vistazo en lo que respecta al origen de Java como un lenguaje de programación.

https://en.wikipedia.org/wiki/Java_(lenguaje_de_programación)

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

Ya que ambos dicen casi lo mismo con respecto a C++, lo publicaré de la wiki: "El lenguaje deriva gran parte de su sintaxis de C y C++, pero tiene menos facilidades de bajo nivel que cualquiera de ellos".

 

De la misma época"La sintaxis de un lenguaje define su forma superficial ". ( corchetes, etc). Lo que se está discutiendo en este hilo no está relacionado con la sintaxis. Mi opinión es que decir que "Java está basado en C++" de la misma manera que lo está MQL, es una afirmación mucho más fuerte con la que no estoy de acuerdo.

Pero como es una afirmación cualitativa podemos tener razón y estar equivocados al mismo tiempo. Aún así no veo como las especificaciones de Java ayudan al OP, cuando hay un enlace específico ya dado con el tema y esto no era una pregunta relacionada con la sintaxis.

Los dos artículos que mencionas, destacan que Java toma prestado de la sintaxis - pero poco más. Esto no es una cuestión relacionada con la sintaxis.

Sin embargo, está relacionado con la representación de punto flotanteIEEE 754 utilizado por MQL, que también es compartida por las lenguas. (y muchos otros que no tienen c como sintaxis - por ejemplo, Pascal, o incluso aplicaciones como Excel) y esto es realmente porque es un estándar apoyado por la mayoría de CPU / FPU en lugar de similitudes sintácticas de los idiomas. La cuestión es la representación de punto flotante de fracciones decimales tiene pequeños errores. El OP quiere redondear a dos decimales. El formato IEEE754 no puede almacenar con precisión una décima (0,1) ni una centésima (0,01). En el formato binario IEEE 754 estas son fracciones binarias recurrentes, (de la misma manera que 1/3 es una fracción decimal recurrente 0.33333... ) - La diferencia entre el número previsto y el número real es bastante pequeña (por ejemplo 0.00000000000001 ) pero es lo suficientemente grande como para que

1/10 != 0.1 // probablemente

Y int(0.1 * 10) podría redondear de forma incorrecta

Pero como OP no ha publicado exactamente lo que están viendo el mejor consejo fue dado de vuelta en el 3er puesto de este tema, ir y leer los hilos MQL. No veo el punto de sugerir también leer las especificaciones de Java también después de los hilos MQL se dan y es probable que no tienen familiaridad con Java.

Resumen del hilo:

  • OP : Los números se comportan de forma extraña
  • WHRoeader: Aquí hay varios enlaces con varias explicaciones de por qué los puntos flotantes son extraños. < La respuesta está aquí en alguna parte...
  • OP: Los entiendo, los números todavía se comportan de forma extraña.
  • JD4: MQL4 y Java se basan en C ++, aquí hay algunos enlaces oscuros de Java en typecasting y promoción, que incluso los desarrolladores de Java encontraría una lectura difícil.
  • ydrol: ¿Cómo ayuda eso al OP exactamente? No estoy de acuerdo con que Java esté basado en C++ Las respuestas se publicaron hace un tiempo...
  • etc. etc.

 
Publiqué la forma de Java de la conversión de tipos por 2 razones. La primera fue, hay que admitirlo, porque estoy más familiarizado con Java. Y 2, hice una búsqueda del código, y tal vez porque estaba cansado cuando lo hice, no vi cómo hacerlo en los docs de MQL. Así que, para tratar de ser útil, sugerí una posible solución que estaba razonablemente seguro de que iba a funcionar, basado en las presunciones de que MQL y Java están lo suficientemente cerca dado sus comparaciones compartidas con un lenguaje común, C++.
 
JD4: Supongo que WH necesita volver a leer, estaba diciendo lo que la página decía que hacía la función, no lo que realmente hace.
  1. Tal vez deberías volver a leer lo que era la pregunta.
    NoLimitations: ¿Por qué iba a seguir obteniendo respuestas con varios decimales si estoy usando MathRound()?
    Lo que la página dice, es lo que hace. Redondea. Nada que ver con la pregunta de los múltiples decimales.
  2. Múltiples decimales es lo que sucede cuando imprimes un doble sin especificar el número requerido.
 
WHRoeder:
JD4: Supongo que WH tiene que volver a leer, estaba diciendo lo que la página decía que hacía la función, no lo que realmente hace.
  1. Tal vez deberías volver a leer lo que era la pregunta.
    NoLimitations: ¿Por qué iba a seguir obteniendo respuestas con varios decimales si estoy usando MathRound()?
    Lo que la página dice, es lo que hace. Redondea. Nada que ver con la pregunta de los múltiples decimales.
  2. Múltiples decimales es lo que ocurre cuando imprimes un doble sin especificar el número requerido.

Lo anterior fue una respuesta específica a tu post específico"MathRound devuelve un doble; número infinito de decimales."

Una vez más, según la página de documentación

"Valordevuelto

Valor redondeado hasta el entero más cercano."

Ahora, una respuesta concreta a esta parte de tu post.

"Lo que dice la página, es lo que hace. Redondea. Nada que ver con la cuestión de los decimales múltiples."

De nuevo, relee la cita, dice que devuelve "Valor redondeado hasta el entero más cercano". Un entero, por definición, es un número entero, sin decimales. Y de nuevo, si esto no es lo que realmente hace, entonces el código o la descripción están rotos, y uno u otro, o ambos, necesitan ser arreglados por MQ, o bien una etiqueta de advertencia indicando que estas funciones no funcionan como se anuncia.

Si realmente devuelve el tipo que se le da, pero al equivalente matemático del valor del entero más cercano (como en devuelve 1.00000 de un 1.23456, y 1 == 1.00000) pero no devuelve un tipo de entero real, entonces la página de referencia necesita especificar algo como "no cambia el tipo de datos subyacente" o alguna otra forma que se indique claramente. Creo que esto fue una traducción plana de la página original en ruso, y como tal, no es tan claro en inglés como debería ser.