Tengo una columna flotante con números de diferente longitud y estoy tratando de convertirlos a varchar.
Algunos valores exceden el tamaño máximo de bigint, así que no puedo hacer algo como esto
cast(cast(float_field as bigint) as varchar(100))
Intenté usar decimal, pero los números no son del mismo tamaño, por lo que esto tampoco ayuda
CONVERT(varchar(100), Cast(float_field as decimal(38, 0)))
Cualquier ayuda es apreciada.
ACTUALIZAR:
El valor de la muestra es 2.2000012095022E + 26 .
sql-server-2008
hgulyan
fuente
fuente
cast(float_field as varchar(max))
de lo contrario no tengo la preguntaRespuestas:
Intenta usar la
STR()
función.Función STR ()
Otra nota: esto rellena a la izquierda con espacios. Si esto es un problema, combine con
LTRIM
:fuente
Select LTRIM(Str(float_field, 38, 0))
para tus datos?Str
función. El número de dígitos después del punto decimal. ¿Leíste el enlace que publiqué? Cambie el cero a 10.Select LTRIM(Str(float_field, 38, 10))
El único bit de consulta que encontré que devuelve el mismo número original EXACT es
Ver http://www.connectsql.com/2011/04/normal-0-microsoftinternetexplorer4.html
Las otras soluciones anteriores a veces redondean o agregan dígitos al final
ACTUALIZACIÓN : Según los comentarios a continuación y lo que puedo ver en https://msdn.microsoft.com/en-us/library/ms187928.aspx :
Debe usarse en nuevas versiones de SQL Server (Azure SQL Database, y comenzando en SQL Server 2016 RC3)
fuente
0
valor flotante convertido como0.0E0
. Necesitaba convertir el campo flotante avarchar
como necesito mostrarNA
cuándoNULL
y0
cómo es. Lo logré agregando unaCASE
declaración en la consulta como se muestra a continuación;CASE WHEN float_field IS NULL THEN 'NA' WHEN float_field = 0 THEN '0' ELSE CONVERT(VARCHAR, float_field, 128) END AS float_As_VChar
Esta es la solución que terminé usando en sqlserver 2012 (ya que todas las otras sugerencias tenían el inconveniente de truncar la parte fraccional o algún otro inconveniente).
salida:
Esto tiene la ventaja adicional (en mi caso) de facilitar la separación y la localización de miles:
salida:
fuente
Tema útil gracias.
Si desea que yo elimine los encabezados cero, puede usar eso:
fuente
flotador solo tiene un máx. precisión de 15 dígitos. Por lo tanto, los dígitos después de la posición 15 son aleatorios, y la conversión a bigint (máx. 19 dígitos) o decimal no le ayuda.
fuente
Esto puede ayudar sin redondear
fuente
Convierte en un
integer
primero y luego en unstring
:fuente
Prueba este, debería funcionar:
fuente
Si usa una función CLR, puede convertir el flotante en una cadena que se parezca al flotante, sin todos los 0 adicionales al final.
Función CLR
.
Ejemplo
.
Salida
.
Consideración
Todas las cadenas convertidas se truncan a 18 decimales, y no hay ceros finales. 18 dígitos de precisión no son un problema para nosotros. Y, el 100% de nuestros números FP (cerca de 100,000 valores) se ven idénticos como valores de cadena como lo hacen en la base de datos como números FP.
fuente
La respuesta de Axel modificada un poco ya que para ciertos casos producirá resultados indeseables.
fuente
de la documentación REPLACE () :
pruebas:
nulo ==> [NULO]
1.11 ==> 1.11
1.10 ==> 1.1
1.00 ==> 1
0.00 ==> 0
-1.10 ==> -1.1
0.00001 ==> 1e-005
0.000011 ==> 1.1e- 005
fuente
Seleccione
cast (replace (convert (decimal (15,2), acs_daily_debit), '.', ',') Como varchar (20))
de acs_balance_details
fuente
Basado en la respuesta molecular:
fuente
Acabo de encontrar una situación similar y me sorprendieron los problemas de redondeo de 'números muy grandes' presentados en SSMS v17.9.1 / SQL 2017.
No estoy sugiriendo que tenga una solución, sin embargo, he observado que FORMAT presenta un número que parece correcto. No puedo dar a entender que esto reduce más problemas de redondeo o es útil dentro de una función matemática complicada.
Se suministró un código SQL que debe demostrar claramente mis observaciones al tiempo que permite a otros probar su código e ideas en caso de necesidad.
fuente
es la mejor manera de no agregar
.0000
ningún dígito al final del valor.fuente