Float, Double e Currency são apenas algumas variáveis que podemos utilizar em Delphi para armazenar valores monetários, quantidades, etc.
No entanto o Double é um pouco problemático, e na sua utilização me deparei com uma série de erros em questões de arredondamento e truncamento.
Com Double você encontra erros onde 5.000 é diferente de 5.000. Erros onde o Delphi jura de pé junto que 0.01 é diferente de 0.01. E convenhamos, uma diferença de 0,01 centavos pode gerar erros constrangedores em softwares de controle de contas.
Quer ver um exemplo assustadoramente real de um erro que podemos encontrar por ai quando utilizamos Double? Então veja a função a seguir:
function TesteDouble: boolean; var d: Double; begin d := 0.01; Result := (d = 0.01); end;
O que você acha que essa função irá retornar: True ou False?
True? A resposta esta E... E... ERRADA! O Delphi retorna False! Utilizando Double 0.01 é diferente de 0.01.
O Double faz algum tipo de arredondamento em background, e por um motivo ou outro 0.00, por exemplo, pode ser 0.000000000001 em Double, o que não é a mesma coisa, e por ai vai.
Solução? Utilize Currency e seja feliz!
function TesteCurrency: boolean; var d: Currency; begin d := 0.01; Result := (d = 0.01); end;
Esta função retornará True.
Sim, 0.01 é igual a 0.01 :D