Maxim Kuznetsov: Dependendo de seus objetivos, às vezes vale a pena ir a números inteiros ao todo. Isso economiza muitos nervos :-) Uma vez eu tive uma tarefa, onde tive que marcar com precisão muitos - muitos níveis, no início eu lutei com o dobro, e depois converti tudo em pontos inteiros de 0 e tudo se tornou fácil, simples e sem erros.
Foi exatamente isso que eu fiz. Eu o converti em números inteiros.
Se você usaMathFloor ou MathCeil para arredondamento, você precisa normalizar o resultado original com a exatidão correta.
Porque durante o cálculo, ao invés de um número inteiro, você pode obter um número fracionário, e devido a este "rabo" do número ser arredondado incorretamente, o resultado é incorreto. Por exemplo:
o exemplo acima com o número 1156.12, este número é armazenado na memória como 1156.1199999999999999891
Ou seja, se você tentar arredondar para um centésimo, você recebe 1156.11 ao invés de 1156.12, que é a "peculiaridade" que o levou a rachar seus miolos.
Para login e uso do site MQL5.com, você deve ativar o uso de cookies.
Ative esta opção no seu navegador, caso contrário você não poderá fazer login.
Você entrou na conta. A autenticação de dois fatores foi desativada. Configure-a novamente e escaneie um novo código QR ou continue com a autenticação de dois fatores desativada.
Dependendo de seus objetivos, às vezes vale a pena ir a números inteiros ao todo. Isso economiza muitos nervos :-) Uma vez eu tive uma tarefa, onde tive que marcar com precisão muitos - muitos níveis, no início eu lutei com o dobro, e depois converti tudo em pontos inteiros de 0 e tudo se tornou fácil, simples e sem erros.
Não é necessário usar arredondamento, a menos que a tarefa o exija.
O problema é esse: as tarefas são diferentes :-)
Se você usaMathFloor ou MathCeil para arredondamento, você precisa normalizar o resultado original com a exatidão correta.
Porque durante o cálculo, ao invés de um número inteiro, você pode obter um número fracionário, e devido a este "rabo" do número ser arredondado incorretamente, o resultado é incorreto.
Por exemplo:
Print (DoubleToStr(1156.12/point, 15));
Print (NormalizeDouble(1156.12/point, _Digits));
agora vamos tentar arredondar com oMathFloor
Print (DoubleToStr(MathFloor(1156.12/point), 15));
Print (MathFloor(NormalizeDouble(1156.12/point, _Digits)));
Se eu normalizar o número para 1.05 - ele irá normalizar para 1.1, o que em princípionão éo que eu preciso usandoo MathFloor :-)
Pois eu não usariao MathFloor de forma alguma.
Mas o problema é diferente.
Но задача то другая.
Por que é diferente? Você disse que precisava arredondar para baixo - MathFloor faz exatamente isso
Por que é diferente? Você disse que precisava arredondar para baixo - isso é o que o MathFloor faz.
sim!!! mas se eu fizer uma normalização ela vai arredondar a matemática para baixo eo MathFloor não fará sentido
o exemplo acima com o número 1156.12, este número é armazenado na memória como 1156.1199999999999999891
Ou seja, se você tentar arredondar para um centésimo, você recebe 1156.11 ao invés de 1156.12, que é a "peculiaridade" que o levou a rachar seus miolos.
o exemplo acima com o número 1156.12, este número é armazenado na memória como 1156.1199999999999999891
ou seja, se você tentar arredondar para um centésimo, você receberá 1156,11 ao invés de 1156,12 - esta é a "peculiaridade" de seu problema.
Sim :-) Obrigado.