Números de punto flotanteFloating-Point Numbers

En este tema se describen algunos de los problemas que los desarrolladores suelen encontrar al trabajar con números de punto flotante en ADO.NET.This topic describes some of the issues that developers frequently encounter when they work with floating-point numbers in ADO.NET. Estos problemas se deben a la manera en que los equipos almacenan números de punto flotante y no son específicos de un proveedor determinado System.Data.SqlClient como System.Data.OracleCliento.These issues are caused by the way that computers store floating-point numbers, and are not specific to a particular provider such as System.Data.SqlClient or System.Data.OracleClient.

En general, los números de punto flotante no tienen una representación binaria exacta.Floating-point numbers generally do not have an exact binary representation. En realidad, el equipo almacena una aproximación del número.Instead, the computer stores an approximation of the number. En diferentes momentos se pueden utilizar diferentes números de dígitos binarios para representar el número.At different times, different numbers of binary digits may be used to represent the number. Cuando un número de punto flotante se convierte de una representación a otra, los dígitos menos significativos de dicho número pueden variar ligeramente.When a floating point number is converted from one representation to another representation, the least significant digits of that number may vary slightly. Por lo general el cambio se produce cuando el número se convierte de un tipo a otro.Conversion typically occurs when the number is cast from one type to another type. La variación se produce si la conversión se realiza en una base de datos, entre tipos que representan valores de base de datos o entre tipos.The variation occurs whether the conversion occurs within a database, between types that represent database values, or between types. Debido a estos cambios, los números que lógicamente deberían ser iguales pueden presentar cambios en sus dígitos menos significativos que hagan que muestren valores diferentes.Because of these changes, numbers that would logically be equal may have changes in their least-significant digits that cause them to have different values. La cantidad de dígitos de precisión en el número puede ser mayor o menor de la esperada.The number of digits of precision in the number may be larger or smaller than expected. Cuando el formato del número cambia a cadena, puede que no muestre el valor esperado.When formatted as a string, the number may not show the expected value.

Para reducir estos efectos al mínimo, debe usar la coincidencia más próxima entre tipos de números que haya disponible.To minimize these effects, you should use the closest match between numeric types that is available to you. Por ejemplo, si está trabajando con SQL Server, el valor numérico exacto puede cambiar si convierte un valor de Transact-SQL de tipo real en un valor de tipo float.For example, if you are working with SQL Server, the exact numeric value may change if you convert a Transact-SQL value of real type to a value of float type. En el .NET Framework, la conversión Single de Double a también puede producir resultados inesperados.In the .NET Framework, converting a Single to a Double may also produce unexpected results. En ambos casos, una estrategia adecuada consiste en establecer que todos los valores de la aplicación usen el mismo tipo numérico.In both of these cases, a good strategy is to make all the values in the application use the same numeric type. También puede utilizar un tipo de decimal de precisión fija o bien convertir los números de punto flotante a un tipo decimal de precisión fija antes de trabajar con ellos.You can also use a fixed-precision decimal type, or cast floating-point numbers to a fixed-precision decimal type before you work with them.

Para solucionar problemas relacionados con la comparación de igualdad, puede codificar la aplicación de forma que se pasen por alto las diferentes en los dígitos menos significativos.To work around problems with equality comparison, consider coding your application so that variations in the least significant digits are ignored. Por ejemplo, en lugar de comparar dos números para comprobar si son iguales, puede restar un número del otro.For example, instead of comparing to see whether two numbers are equal, subtract one number from the other number. Si la diferencia se sitúa en un margen aceptable de redondeo, la aplicación puede considerar los números como si fuesen iguales.If the difference is within an acceptable margin of rounding, your application can treat the numbers as if they are the same.

Vea tambiénSee also