Erro em Valores Float
Olá,
Tenho um campo (valor) do tipo numeric(18,4). Gravo um registro com o valor 10,04 nele.
Depois de gravado, se eu fizer uma showmessage(formatFloat(´0.00000000000000000´,ClientDataSetContasReceber.FieldByName(´VALOR´).asFloat, vai mostrar o seguinte resultado: 10,03999999999992000. O correto seria 10,0400000000000000 logicamente.
Esssa inconsistência acaba gerando erros em cálculos.
Alguém sabe a causa disso e como resolver?
Uso FB 2.0 e D7
Obrigado
Tenho um campo (valor) do tipo numeric(18,4). Gravo um registro com o valor 10,04 nele.
Depois de gravado, se eu fizer uma showmessage(formatFloat(´0.00000000000000000´,ClientDataSetContasReceber.FieldByName(´VALOR´).asFloat, vai mostrar o seguinte resultado: 10,03999999999992000. O correto seria 10,0400000000000000 logicamente.
Esssa inconsistência acaba gerando erros em cálculos.
Alguém sabe a causa disso e como resolver?
Uso FB 2.0 e D7
Obrigado
Armindo
Curtidas 0
Respostas
Aroldo Zanela
31/01/2008
Colega,
Existem longas discussões aqui e na Web (google) em face as questões relacionadas a mantissa de número de ponto flutuando. Para encurtar o assunto, use tipos currency para evitar problemas.
Existem longas discussões aqui e na Web (google) em face as questões relacionadas a mantissa de número de ponto flutuando. Para encurtar o assunto, use tipos currency para evitar problemas.
GOSTEI 0
Armindo
31/01/2008
[quote:b2910bef4c=´Aroldo Zanela´]Colega,
Existem longas discussões aqui e na Web (google) em face as questões relacionadas a mantissa de número de ponto flutuando. Para encurtar o assunto, use tipos currency para evitar problemas.[/quote:b2910bef4c]
Obrigado pela resposta, mas como ficaria essa instrução SQL: CAST((VALOR1 + VALOR2) AS [b:b2910bef4c]FLOAT[/b:b2910bef4c])AS VALORTOTAL?
Obrigado
Existem longas discussões aqui e na Web (google) em face as questões relacionadas a mantissa de número de ponto flutuando. Para encurtar o assunto, use tipos currency para evitar problemas.[/quote:b2910bef4c]
Obrigado pela resposta, mas como ficaria essa instrução SQL: CAST((VALOR1 + VALOR2) AS [b:b2910bef4c]FLOAT[/b:b2910bef4c])AS VALORTOTAL?
Obrigado
GOSTEI 0
Aroldo Zanela
31/01/2008
Colega,
Na consulta SQL não há necessidade de efetuar casting, considerando que os tipos já são numéricos (18,4).
Na consulta SQL não há necessidade de efetuar casting, considerando que os tipos já são numéricos (18,4).
GOSTEI 0
Armindo
31/01/2008
[quote:3d16ab82ce=´Aroldo Zanela´]Colega,
Na consulta SQL não há necessidade de efetuar casting, considerando que os tipos já são numéricos (18,4).[/quote:3d16ab82ce]
Na verdade eu preciso sim. É que essas consultas são para relatórios e como utilizo o Fortes Report e este, no seu componente RLDBResult, não soma valores numéricos, eu transformava em float para a soma dar certo.
Mas resolvi de outra maneira: vou seguir seu conselho e utilizar o tipo currency na aplicação de forma em geral, em substituição ao tipo float/extended. Nos relatórios crio um campo calculado para os totais.
Obrigado.
Na consulta SQL não há necessidade de efetuar casting, considerando que os tipos já são numéricos (18,4).[/quote:3d16ab82ce]
Na verdade eu preciso sim. É que essas consultas são para relatórios e como utilizo o Fortes Report e este, no seu componente RLDBResult, não soma valores numéricos, eu transformava em float para a soma dar certo.
Mas resolvi de outra maneira: vou seguir seu conselho e utilizar o tipo currency na aplicação de forma em geral, em substituição ao tipo float/extended. Nos relatórios crio um campo calculado para os totais.
Obrigado.
GOSTEI 0