Partilhar via


Números de vírgula flutuante

Este tópico descreve alguns dos problemas que os desenvolvedores frequentemente encontram quando trabalham com números de vírgula flutuante no ADO.NET. Esses problemas são causados pela maneira como os computadores armazenam números de vírgula flutuante e não são específicos de um provedor específico, como System.Data.SqlClient ou System.Data.OracleClient.

Os números de vírgula flutuante geralmente não têm uma representação binária exata. Em vez disso, o computador armazena uma aproximação do número. Em momentos diferentes, números diferentes de dígitos binários podem ser usados para representar o número. Quando um número de ponto flutuante é convertido de uma representação para outra, os dígitos menos significativos desse número podem variar ligeiramente. A conversão normalmente ocorre quando o número é convertido de um tipo para outro. A variação ocorre se a conversão ocorre dentro de um banco de dados, entre tipos que representam valores de banco de dados ou entre tipos. Devido a essas mudanças, números que seriam logicamente iguais podem ter mudanças em seus dígitos menos significativos que fazem com que eles tenham valores diferentes. O número de dígitos de precisão no número pode ser maior ou menor do que o esperado. Quando formatado como uma cadeia de caracteres, o número pode não mostrar o valor esperado.

Para minimizar esses efeitos, você deve usar a correspondência mais próxima entre os tipos numéricos que está disponível para você. Por exemplo, se você estiver trabalhando com o SQL Server, o valor numérico exato poderá ser alterado se você converter um valor Transact-SQL de tipo real em um valor de tipo float. No .NET Framework, a conversão de a Single em a Double também pode produzir resultados inesperados. Em ambos os casos, uma boa estratégia é fazer com que todos os valores no aplicativo usem o mesmo tipo numérico. Você também pode usar um tipo decimal de precisão fixa ou converter números de vírgula flutuante em um tipo decimal de precisão fixa antes de trabalhar com eles.

Para contornar problemas com a comparação de igualdade, considere codificar seu aplicativo para que as variações nos dígitos menos significativos sejam ignoradas. Por exemplo, em vez de comparar para ver se dois números são iguais, subtraia um número do outro. Se a diferença estiver dentro de uma margem aceitável de arredondamento, o seu pedido pode tratar os números como se fossem os mesmos.

Consulte também