Posição Tamanho Retornando Valor Negativo - página 2

 
NoLimitations:

Eu também tentei usar isso sem sucesso. Possivelmente a DTS simplesmente muda a precisão de um valor para a aparência e não o valor real? Não vejo nenhuma outra opção.

Sim, acho que a string apenas torna o valor no duplo uma versão imprimível, mas não o altera. Não tenho certeza de como fazê-lo em MQL, mas sei que em Java você pode forçar uma conversão do tipo de um tipo para outro (neste caso, o dobro para int).

Do oráculo docs em http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html. Esta é apenas uma pequena parte do código apresentado.

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

No seu caso, acredito que você o faria dizer algo como

int intConvertedDouble = (int) valueYouGotItFrom;

Obviamente, você precisaria ajustar os nomes para se adequar melhor ao seu código.

http://www.studytonight.com/java/type-casting-in-java também o cobre lá. Já que Java e MQL são ambos supostamente baseados em C++, isto pode ajudar você.

 

@OP, bem como a leitura de todos os links MQL4 anteriormente publicados, veja Trabalhando com Duplas e PrintFormat

@JD4 Não vejo como o lançamento de código Java e a referência a especificações Java ajudam a OP. Também Java e C++ são similares, mas não concordo que se baseiem em C++.

Embora você esteja tentando ser útil, acho que muitas de suas respostas quando você mesmo não tem certeza das respostas, só levam a confundir as pessoas que procuram ajuda.

 
ydrol:

@OP, bem como a leitura de todos os links MQL4 anteriormente publicados, veja Trabalhando com Duplas e PrintFormat

@JD4 Não vejo como o lançamento de código Java e a referência a especificações Java ajudam a OP. Também Java e C++ são similares, mas não concordo que se baseiem em C++.

Embora você esteja tentando ser útil, acho que muitas de suas respostas quando você mesmo não tem certeza das respostas, só levam a confundir as pessoas que procuram ajuda.

Em relação a seus pensamentos C++, dê uma olhada em https://www.mql5.com/en/docs/basis. Diz ali mesmo, e como eles modificaram a MQL4 para ser mais parecida com a MQL5(https://docs.mql4.com/mql4changes), ela se aplica aqui também. Quanto à minha base de conhecimentos, nunca afirmei ser um especialista, e eu deixo as pessoas saberem que quando eu postar, se eu não tiver certeza de algo, pelo menos eu tento, às vezes posso sentir falta disso.Se eu dirijo um Chevy, e estou tendo problemas com ele, não vou sentar lá e descontar conselhos de alguém que só trabalha em Fords se for um conselho útil, mesmo que não seja bem pago. Também não vou sentar lá e dizer-lhes que não acham que você pode ajudar, se eles estão fazendo isso para tentar ser útil.
 

Acho que você leu mal meu posto. O Mql4 OO é certamente baseado no c++. Não creio que haja qualquer disputa sobre isso. Eu estava me referindo à sua afirmação:

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

seguida de muitas referências Java. Eu disse -

ydrol: Também Java e C++ são similares, mas não concordo que seja baseado em C++

Eu estava falando especificamente de suas referências Java. Java não é baseado em c++ na minha opinião.

Em qualquer caso, o assunto da representação de decimais em ponto flutuante foi abordado várias vezes nos tópicos mencionados anteriormente pela WHRoeder.

Parece que a OP quer arredondar para duas casas decimais, mas sem postar nenhuma saída ou exemplos específicos, acho que o grau de erro de arredondamento que eles estão vendo pode ser ignorado.

 
JD4: Não de acordo com a página do documento para isso. https://docs.mql4.com/math/mathround
NoLimitações: JD4 está certo, a página do documento diz que ele arredonda para o número inteiro mais próximo.

Ambos estão errados. Ele arredonda para o número inteiro mais próximo. Irrelevante. Retorna um duplo.

Aprenda sobre o ponto flutuante. O == operando. - Fórum MQL4



 

Adivinhe o que precisa voltar e reler, eu estava dizendo o que a página dizia que a função fazia, não o que ela realmente faz. E a programação de computadores é um dos poucos lugares onde (int) 1 != (duplo) 1.00000000 (ad infinitum) em relação aos tipos de dados.


@ ydrol, eu perdi a direção de sua intenção com sua declaração re MQL/Java/C++. Algum material de referência para você dar uma olhada em relação à origem do Java como uma linguagem de programação.

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

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

Já que ambos dizem quase a mesma coisa em relação ao C++, postarão do wiki: "A linguagem deriva muito de sua sintaxe do C e C++, mas tem menos facilidades de baixo nível do que qualquer um deles".

 

Desde a mesma idade"A sintaxe de uma língua define sua forma superficial ". (parênteses encaracolados, etc.). O que está sendo discutido neste tópico não está relacionado à sintaxe. Minha opinião é que dizer "Java é baseado em C++" da mesma forma que MQL é, é uma afirmação muito mais forte da qual eu discordo.

Mas como se trata de uma declaração qualitativa, podemos estar certos e errados ao mesmo tempo. Ainda não vejo como as especificações Java ajudam a OP, quando já há uma ligação específica com a questão e esta não foi uma questão relacionada à sintaxe.

Ambos os artigos que você menciona , enfatizam que Java toma emprestado da sintaxe - mas pouco mais. Esta não é uma questão relacionada com a sintaxe.

Entretanto, está relacionada à representação de ponto flutuanteIEEE 754 utilizada pela MQL, que também é compartilhada pelas linguagens. (e muitas outras que não têm c como sintaxe - por exemplo Pascal, ou mesmo aplicações como Excel) e isto é realmente porque é um padrão suportado pela maioria das CPU/FPU em vez de similaridades sintáticas das linguagens. A questão é que a representação de ponto flutuante de frações decimais tem pequenos erros. O OP quer arredondar para duas casas decimais. O formatoIEEE 754 não pode armazenar com precisão um décimo (0,1) nem um centésimo (0,01). No formato binárioIEEE 754 estas são frações binárias recorrentes, (da mesma forma que 1/3 é uma fração decimal recorrente 0,33333... ) - A diferença entre o número pretendido e o número real é bastante pequena (por exemplo 0,00000000000001 ), mas é grande o suficiente para que

1/10 != 0,1 // provavelmente

E int(0.1 * 10) pode dar a volta errada

Mas como a OP não postou exatamente o que está vendo, os melhores conselhos foram dados no terceiro post deste assunto, vá e leia os tópicos do MQL. Não vejo a utilidade de sugerir que eles também leiam as especificações Java depois que as threads MQL são dadas e provavelmente não têm nenhuma familiaridade com Java.

Resumo das threads:

  • OP : Números estão se comportando de maneira engraçada
  • WHRoeader: Aqui estão vários links com várias explicações para que os pontos flutuantes sejam estranhos. < A resposta está aqui em algum lugar ...
  • OP: Eu os entendo, os números ainda estão se comportando de maneira engraçada.
  • JD4: MQL4 e Java são baseados em C++, aqui estão alguns links obscuros de Java sobre digitação e promoção, que mesmo os desenvolvedores Java encontrariam uma leitura difícil.
  • ydrol: Como isso ajuda a OP exatamente? Eu não concordo que Java é baseado em C++ Respostas foram postadas há um tempo atrás...
  • etc., etc.

 
Eu coloquei a forma Java de conversão de tipo por 2 razões: primeiro, é verdade, porque estou mais familiarizado com Java. E 2, eu fiz uma pesquisa do código, e talvez porque estava cansado quando o fiz, não vi como fazê-lo em documentos MQL. Então, para tentar ser útil, eu sugeri uma possível solução que eu estava razoavelmente certo de que funcionaria, baseado em suposições de que MQL e Java estão suficientemente próximos um do outro, dadas suas comparações compartilhadas com uma linguagem comum, C++.
 
JD4: Adivinhe o que precisa voltar e reler, eu estava dizendo o que a página dizia que a função fazia, não o que ela realmente faz.
  1. Talvez você devesse voltar atrás e reler qual era a pergunta.
    NoLimitações: Por que eu ainda estaria obtendo respostas a múltiplas casas decimais se estou usando MathRound()?
    O que a página diz, é o que ela faz. Ela é redonda. Nada a ver com a questão das múltiplas casas decimais.
  2. Múltiplas casas decimais é o que acontece quando você imprime um duplo sem especificar o número necessário.
 
WHRoeder:
JD4: Adivinhe o que precisa voltar e reler, eu estava dizendo o que a página dizia que a função fazia, não o que ela realmente faz.
  1. Talvez você devesse voltar atrás e reler qual era a pergunta.
    NoLimitações: Por que eu ainda estaria obtendo respostas a múltiplas casas decimais se estou usando MathRound()?
    O que a página diz, é o que ela faz. Ela é redonda. Nada a ver com a questão das múltiplas casas decimais.
  2. Múltiplas casas decimais é o que acontece quando você imprime um duplo sem especificar o número necessário.

O acima foi uma resposta específica ao seu posto específico"MathRound retorna um duplo; número infinito de casas decimais". "

Mais uma vez, de acordo com a página de documentação.

"Valor de retorno

Valor arredondado até o número inteiro mais próximo."

Agora, uma resposta específica a esta parte do seu posto.

"O que a página diz, é o que ela faz". Ela é redonda. Nada a ver com a questão das múltiplas casas decimais."

Mais uma vez, releia a citação, ela diz que retorna "Valor arredondado até o inteiro mais próximo". Um inteiro, por definição, é um número inteiro, como em nenhuma casa decimal. E mais uma vez, se isto não for de fato o que realmente faz, então o código ou a descrição é quebrado, e um ou outro ou ambos precisam ser fixados pela MQ, ou então uma etiqueta de advertência afirmando que estas funções não funcionam como anunciado.

Se ele realmente retorna o tipo que é dado, mas no equivalente matemático ao valor inteiro mais próximo (como nos retornos 1,00000 de um 1,23456, e 1 == 1,00000) mas não retorna um tipo inteiro real, então a página de referência precisa especificar algo como "não muda o tipo de dado subjacente" ou alguma outra forma que seja claramente declarada.

Razão: