Los problemas de redondéo

Un profano en la materia (e incluso muchos programadores novatos) no son conscientes de los problemas que suponen la gestión de los números decimales. El problema fundamental viene determinado por el hecho de que los ordenadores no pueden guardar los números no enteros con la precisión que esperamos. E incluso esas desviaciones entre el número deseado y el almacenado pueden diferir entre distintas tecnologías: procesadores, sistemas operativos, lenguajes de programación e incluso aplicaciones.

Les puedo asegurar que es un problema que te puede quitar el sueño como programador si no lo tienes presente al desarrollar.

Un sistema de gestión están plagado de operaciones matemáticas, por ejemplo: cálculo de cuota de IVA, de metros cuadrados y cúbicos, de totales multiplicando unidades y precios, descuentos, etc. Para hacer consistente el sistema hay que hacer un redondeo a un número determinado de decimales; generalmente las unidades a 3 decimales y las cantidades monetarias a 2, aunque esto se puede modificar fácilmente en Criterium CyP. En este punto es cuando nos encontramos con las primera decisión: qué sistema de redondeo debemos aplicar.

Parece una cuestión sencilla y es así cuando el decimal a eliminar no es un 5. Cuando esto sucede hay que tomar la decisión de redondear para arriba o para abajo. Los distintos sistemas de redondeo tratan de lidiar con este problema: el punto intermedio. Se tiende a balancear el redondeo del punto intermedio (decimal 5) para que el mismo no perjudique en el mismo sentido. Un ejemplo práctico, si un proveedor siempre redondeara el 5 para arriba y tuviésemos una cantidad importante de facturas con él, al final terminaría perjudicándonos a nosotros. Por ejemplo, el redondeo bancario soluciona este problema redondeando siempre al par mas cercano.

Una cuestión adicional a tener en cuenta es que el método de redondeo utilizado debe ser el mismo que se utilice en las funciones internas del servidor de la base de datos y en los programas clientes, Criterium CyP en este caso.

En nuestro caso hemos optado por el redondeo aritmético simétrico.

Sin embargo esto no es todo. Está el problema indicado al principio, el ordenador no guarda los números con decimales con la precisión esperada. Si tratamos de redondear 12,555 sale 12,55, cuando según el método empleado debería ser 12,56. El error viene determinado por el hecho de que ese 12,555 en realidad está guardado como 12,55499999999, o algo similar, con lo que redondea correctamente un número incorrecto.

De todas formas no se preocupe, en Criterium CyP, también hemos solucionado ese problema, utilizamos funciones específicas para evitar esos errores, consistentes entre la base de datos y el cliente.

Desde luego esta entrada no pretende ser exhaustiva a la hora de explicar el problema, solo pretendemos que cuando dando soporte técnico les comentemos sobre la complejidad en la gestión de decimales, les suene de algo.

Producto: