Estamos atrapados con una base de datos que (desafortunadamente) usa flotantes en lugar de valores decimales. Esto hace que el redondeo sea un poco difícil. Considere el ejemplo siguiente (SQL Server T-SQL):"Medio redondeado" en valores de punto flotante
SELECT ROUND(6.925e0, 2) --> returns 6.92
ROUND
hace round half up, pero desde floating point numbers cannot accurately represent decimal numbers, se muestra el resultado "malo" (desde el punto de vista del usuario final). Entiendo por qué esto sucede.
ya me ocurrió con dos soluciones posibles (tanto devuelve un real, que es, por desgracia, también es un requisito):
- convertir a un tipo de datos decimal antes del redondeo:
SELECT CONVERT(float, ROUND(CONVERT(decimal(29,14), 6.925e0), 2))
- Multiplicar hasta el tercer dígito está en el lado izquierdo de la coma decimal (es decir, representados con precisión), y luego hacer el redondeo:
SELECT ROUND(6.925e0 * 1000, -1)/1000
Cuál debería elegir? ¿Hay alguna solución mejor? (Por desgracia, no podemos cambiar los tipos de campo en la base de datos debido a algunas aplicaciones heredadas acceso a la misma base de datos.)
¿Existe una solución bien establecida las mejores prácticas para este problema (común?)?
(Obviamente, la técnica común "redondeo dos veces" no ayudará aquí desde 6.925 está ya redondeado a tres decimales - por lo que esto es posible en un flotador.)
Lo etiqueté tanto 'sql-server' como' language-agnostic', ya que los ejemplos están en T-SQL pero la pregunta sobre un algoritmo de mejores prácticas es genérica. – Heinzi
No existe un algoritmo o una función que pueda lograr lo que desea porque la mayoría de los flotantes que son múltiplos de una fracción de base 10 no son exactamente representables. Por ejemplo, 6.925 se representa como un valor ligeramente superior o inferior, pero nunca exacto. ¿De qué manera quieres que se redondee? – hirschhornsalz