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).
// 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.
@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.
@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.
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.
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...
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.
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.
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.
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.
No seu caso, acredito que você o faria dizer algo como
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.
@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.
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.
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:
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.