2011-11-11 11 views
7

Tengo el valor 1555.4899999999998 almacenado en una columna float con precisión predeterminada (53). Cuando hago un simple select, SSMS redondea la salida en lugar de imprimirla con toda la precisión disponible. Me ha causado algunos problemas recientemente, ya que el valor impreso no funciona como un literal float para que coincida con el valor almacenado real.Salida de precisión completa de los tipos de coma flotante en SQL Server Management Studio

Por ejemplo (en cuenta que ambos de estos números tienen una representación exacta en el defecto float),

declare @f1 float 
declare @f2 float 
set @f1 = 1555.49 
set @f2 = 1555.4899999999998 
select @f1, @f2 
select STR(@f1,30,15), STR(@f2,30,15) 

Salidas:

1555.49 1555.49 
1555.490000000000000 1555.489999999999800 

En Analizador de consultas, que los primeros select salidas:

1555.49 1555.4899999999998 

Ese es el comportamiento que quiero obtener de Management Studio. ¿Hay alguna manera de evitar que el SSMS se redondee en la pantalla de resultados?

Respuesta

7

SQL Server Management Studio redondea los valores de punto flotante para fines de visualización; hay un Connect suggestion to change this behavior, pero está cerrado "como por diseño". Sin embargo, SQLCMD, osql y el Analizador de consultas no.

SQLCMD -E -S server -Q"SELECT CONVERT(FLOAT, 1555.4899999999998)" 
0

¿Hay alguna razón por la que prefiera usar un tipo de letra flotante que un tipo decimal? Los flotantes se almacenan como fracciones, lo que provoca que a menudo sean ligeramente inexactos al realizar operaciones sobre ellos. Esto está bien cuando tienes una aplicación de gráficos donde la inexactitud es mucho menos significativa que el tamaño de un píxel, pero es un gran problema en algo así como una aplicación de contabilidad en la que tienes que lidiar con dinero.

Me atrevo a decir que la precisión de un decimal es más importante para la mayoría de las aplicaciones que cualquier beneficio en velocidad o tamaño que obtendrían al usar un flotador.

+1

El esquema de base de datos está fuera de mi control, Desafortunadamente. Estoy 100% de acuerdo en que 'flotar 'es una mala opción para esta aplicación, pero si fuera del tipo correcto, esperaría una representación más precisa en Management Studio. – Simon

-2

Editar a mi publicación original. Estaba intentando resolver un problema ligeramente diferente cuando me encontré con esta página. Solo quería que un tipo de letra flotante devolviera un número "normal", no una notación científica.

Dos conversiones sugeridas originalmente. Herido con esto en ese extremo. El siguiente 7 podría cambiarse para mostrar tantos decimales como desee. Reemplazar y los ajustes eliminan los ceros iniciales y finales.

REPLACE (RTRIM (LTRIM (reemplace (STR (x, 20, 7), '0', ' '))),'', '0')

+2

El objetivo no es convertir a VARCHAR. Las llamadas STR() en mi ejemplo ya lo hacen. Esperaba cambiar el comportamiento predeterminado de SSMS sin tener que agregar conversiones a mi consulta. Por cierto, 5 lugares después del punto decimal no son suficientes para eliminar la ambigüedad de los valores en mi ejemplo, tampoco. Necesitarías al menos DECIMAL (28,13) para eso. – Simon

+0

Edité mi respuesta. Aún no ayuda con SSMS. Solo devuelve la representación de cadena que quería. Quizás una solución útil. – user600410

Cuestiones relacionadas