NormalizarDuplo paradoxo

 

Boa tarde!

Por mais que eu leia esta seção de Ajuda, ainda não consigo descobrir de onde vem aquela fracionária 1 no final.

Tenha em mente que quando um número normalizado é impresso para o Jornal usando Print(), ele pode conter mais casas decimais do que você espera. Por exemplo,

duplo a=76.671;// número normalizado com 3 casas decimais
Print("Print(76.671)=",a);// imprimir como está
Print("DoubleToString(a,8)=",DoubleToString(a,8));// imprimir com a precisão especificada

é emitido no terminal:

DoubleToString(a,8)=76.67100000
Print(76.671)=76.67100000000001

 
transcendreamer:

boa tarde!

Por mais que eu leia esta seção de Ajuda, ainda não consigo descobrir de onde vem aquela fracionária 1 no final.

Tenha em mente que quando um número normalizado é impresso para o Jornal usando Print(), ele pode conter mais casas decimais do que você espera. Por exemplo,

duplo a=76.671;// número normalizado com 3 casas decimais
Print("Print(76.671)=",a);// imprimir como está
Print("DoubleToString(a,8)=",DoubleToString(a,8));// imprimir com a precisão especificada

é emitido no terminal:

DoubleToString(a,8)=76.67100000
Print(76.671)=76.67100000000001

O tipo duplo tem limitações de precisão devido às quais podem ocorrer erros.

Eu recomendo este artigo: https://www.mql5.com/ru/articles/1561

Особенности работы с числами типа double в MQL4
Особенности работы с числами типа double в MQL4
  • 2009.11.02
  • MetaQuotes Software Corp.
  • www.mql5.com
В данной заметке собраны советы по решению наиболее часто возникающих ошибок при работе с числами типа double в программах на MQL4.
 
ENSED:

O tipo duplo tem limitações na precisão, o que pode levar a erros.

Eu recomendo este artigo: https://www.mql5.com/ru/articles/1561

Eu vejo a recomendação, obrigado.

Você pode usar o DoubleToStr na saída

mas não está claro de onde essa está vindo em primeiro lugar!

Se eu estava fazendo divisão/multiplicação, OK, está tudo bem, é um erro.

Mas em uma constante? que eu mesmo prescrevi?

Acontece que tenho que usar arredondamento para uma constante que inicialmente não tem essa precisão

e o mais importante, a confiança no que está de fato armazenado na variável dupla é minada!

 

Citação da documentação

Необходимо помнить, что вещественные числа хранятся в памяти компьютера с некоторой ограниченной точностью в двоичной системе счисления, в то время как общепринятой в использовании является десятичная система счисления. Поэтому многие числа, которые точно записываются в десятичной системе, в двоичной системе можно записать только в виде бесконечной дроби.

Por exemplo, os números 0,3 e 0,7 são representados no computador como frações infinitas, enquanto o número 0,25 é armazenado exatamente como se fosse uma potência de dois.

 
stringo:

Citação da documentação

interessante...

Já estou supondo que não esteja em MQL, mas em algum lugar mais profundo, no nível dos padrões dos anos 80

mas ainda muito estranho...

Não o vi em nenhuma outra língua de aplicação

seria razoável ter algumas soluções ao nível da própria linguagem MQL

 

e ainda não explica porque o código abaixo dá 0000000001 caudas

current=NormalizeDouble(GlobalVariableGet("Equity-"+portfolio_id),2);

text = "Positions closed at " + (string)current + " for portfolio: " + portfolio_name;

if(!automatic) MessageBox(text,""); else Print(text);

porque eu fiz a normalização

e o número continua a ser seguido.

 
transcendreamer:

interessante...

Já estou supondo que não se trata de MQLs, mas em algum lugar mais abaixo no nível dos padrões da década de 80

mas ainda é muito estranho...

Não vi isto em nenhuma outra linguagem de aplicação

seria razoável ter algumas soluções a nível de MQL

O que há de tão difícil nisso?

Se você precisar de precisão de até 4 dígitos. Multiplique o número por 10000, descarte a parte fracionária e divida por 10000.

As funções matemáticas do mql podem ser encontradas na documentação.

 

texto = "Posições fechadas em " + (string)corrente + " para carteira: " + nome_da_carteira;

DoubleTo String para corrente e você ficará bem

 

Sim, eu já percebi que precisamos forçar o arredondamento

NormalizeDuplo aparentemente não consegue fazer o trabalho

 
transcendreamer:

Sim, eu já percebi que precisamos forçar o arredondamento

NormalizeDuplo não parece fazer o trabalho

NormalizeDouble é exatamente como funciona (e sempre funcionou dessa forma, a partir do primeiro MQL)

Um número é multiplicado por 10 para o poder dos dígitos, convertido em forma inteira (descartando a parte fracionada), e depois dividido por 10 para o poder dos dígitos

Qual é o problema? Quebrando o padrão?

 
stringo:

NormalizeDouble funciona exatamente assim (e sempre funcionou assim desde o primeiro MQL)

O número é multiplicado por 10 para o poder dos dígitos, convertido em forma inteira (descartando a parte fracionária), e depois dividido por 10 para o poder dos dígitos

Qual é o problema? Quebrando o padrão?

Uma quebra de padrão é que mesmo após a normalização há caudas!