Pergunta

Eu tenho uma variável TDATETIME que recebe um valor no tempo de execução de 40510.416667. Quando extraio o tempo para uma variável do tipo TTime usando a função FRAC, ela a define como 0,41666666666. Por que mudou a precisão do valor e existe uma troca de retenção para reter a precisão do valor original, isto é. Para defini -lo como 0,416667.

Foi útil?

Solução

Uma das razões para a perda de precisão é que o TDATETIME é um duplo, e o parâmetro e o valor de retorno do FRAC é estendido do tipo.

Ao converter pontos flutuantes de um tipo para outro, algum A precisão pode ser perdida. (O mesmo acontece ao fazer aritmética neles).

Para comparar o valor do float corretamente, você deve usar a função CompareValue da matemática da unidade.

Outras dicas

TDATETIME é um número de ponto flutuante. Alguns números não podem ser representados exatamente como um número de ponto flutuante. 0.416667 / 0,41666666666 parece ser outro.

Você pode arredondar para 5 ou 6 dígitos para exibição. Isso leva a precisão de cerca de 1 segundo.

O que todo cientista da computação deve saber sobre números de ponto flutuante deve ajudar, assim como o próprio Precisão do ponto flutuante - Isso fornecerá algumas informações detalhadas para ir com a resposta de Jeff.

Obrigado por toda a sua ajuda nisso, muito apreciada. Para contornar o meu ProBllen que surgiu devido à alteração na precisão, usei a função de comparação em vez do> = ou <= operadores para comparar os tempos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top