Duplo versus FLOAT - erro de MathFloor não claro - página 7

 
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.
 
Vladimir:

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:

double point=0.01;
Print (DoubleToStr(1156.12/point, 15));
Print (NormalizeDouble(1156.12/point, _Digits));

agora vamos tentar arredondar com oMathFloor

double point=0.01;
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

 
Taras Slobodyanik:

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.

 
Taras Slobodyanik:

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.