Obter o número de casas decimais de quaisquer números (não apenas citações) contornando Dígitos() em MQL4 e MQL5 - página 5

 
A100:

Você precisa de um

para que

o resultado foi: 4

Exatamente quatro? Vamos fazer isso.

 
fxsaber:

Talvez seja exatamente essa a função que você precisa. Respondeu o TC

Ele precisa exatamente dessa função, porque (como você observou corretamente) nem todos os números podem ser representados exatamente como o dobro, o que significa que resolver o problema sem especificar a precisão não tem sentido (porque, no caso geral, leva a resultados absurdos).

 
A100:

Ele precisa exatamente disso, porque (como você observou corretamente) nem todos os números podem ser representados com precisão como um duplo, o que significa que resolver o problema sem especificar a precisão não tem sentido (porque em geral leva a resultados absurdos).

Quais são as opções para especificar a precisão sem alterar o número de casas decimais, ou como posso eliminar a desvantagem que descrevi em minha versão? Para mim, encontrei apenas (cordel) valor

 
Alexandr Sokolov:

Quais são as opções para especificar a precisão sem alterar o número de casas decimais, ou como posso eliminar a desvantagem que descrevi em minha versão? Para mim, encontrei apenas (cordel) valor

Acho que você quer dizer dentro de que limites procurar o último não-zero.

 

Eu tentei fazer um cálculo do número de casas decimais através de MathMod() com um divisor consecutivo 0,1, depois 0,01 ... 0,000(15 zeros) 1, não funcionou, a precisão do número mantém "flutuante" a necessidade de normalizar cada vez, e se você usar a normalização, então é mais fácil comparar o número que você quer e normalizado com que sinal - se diferente, então encontrei o último sinal

HH: há outra opção, não teve tempo de verificar - multiplique um número real sem uma parte inteira de 10 ^ 16 e salve tudo em um longo tempo, e então divida por 10 e verifique o restante da divisão, se = 0, então novamente divida

 
Igor Makanu:

ZS: há outra opção, não tive tempo de verificar - multiplique um número real sem uma parte inteira por 10^16 e salve tudo em um longo tempo, e então divida por 10 e verifique o restante da divisão, se = 0, então divida novamente

Não vai funcionar.

 
Usepontoduplo()
Logaritmo decimal, sinal de descarte...
 
Aliaksandr Hryshyn:
Usepontoduplo()
Logaritmo decimal, sinal descartado...

Também testado, de jeito nenhum.

É isso aí.

void OnStart()
{
 double p = 0.07;
 Print(p);
}/*******************************************************************/

dá este resultado

2018.11.05 10:43:05.138 !00 (GBPJPY,H1) 0.07000000000000001
Adivinhe três vezes o que é o logaritmo...
 
Alexey Viktorov:
Também testado, não vai funcionar.
Por que não? Arredondar para o todo.
 
Veja o que a função Point() retorna.
Razão: