Eu tenho uma coluna flutuante com números de comprimento diferente e estou tentando convertê-los em varchar.
Alguns valores excedem o tamanho máximo de bigint, por isso não posso fazer algo assim
cast(cast(float_field as bigint) as varchar(100))
Eu tentei usar decimal, mas os números não são do mesmo tamanho, então isso também não ajuda
CONVERT(varchar(100), Cast(float_field as decimal(38, 0)))
Qualquer ajuda é apreciada.
ATUALIZAR:
O valor da amostra é 2.2000012095022E + 26 .
sql-server-2008
hgulyan
fonte
fonte
cast(float_field as varchar(max))
caso contrário eu não entendo a perguntaRespostas:
Tente usar a
STR()
funçãoFunção STR ()
Outra observação: esta almofada à esquerda com espaços. Se este for um problema, combine com
LTRIM
:fonte
Select LTRIM(Str(float_field, 38, 0))
para seus dados?Str
função. O número de dígitos após o ponto decimal. Você leu o link que eu postei? Altere o zero para 10.Select LTRIM(Str(float_field, 38, 10))
O único bit de consulta que encontrei que retorna exatamente o mesmo número original é
Consulte http://www.connectsql.com/2011/04/normal-0-microsoftinternetexplorer4.html
As outras soluções acima às vezes arredondam ou adicionam dígitos no final
ATUALIZAÇÃO : Conforme os comentários abaixo e o que posso ver em https://msdn.microsoft.com/en-us/library/ms187928.aspx :
Deve ser usado em novas versões do SQL Server (Banco de Dados SQL do Azure e iniciando no SQL Server 2016 RC3)
fonte
0
valor flutuante sendo convertido como0.0E0
. Eu precisava converter o campo flutuante paravarchar
como eu precisava exibirNA
quandoNULL
e0
como é. Eu consegui isso adicionandoCASE
instrução na consulta como abaixo;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 é a solução que acabei usando no sqlserver 2012 (já que todas as outras sugestões tinham a desvantagem de truncar parte fracionária ou outra desvantagem).
resultado:
isso tem a vantagem adicional (no meu caso) de facilitar a separação e a localização de milhares:
resultado:
fonte
Tópico útil obrigado.
Se você quer que eu remova os leads zero, use:
fonte
o flutuador tem apenas um máx. precisão de 15 dígitos. Os dígitos após a 15ª posição são, portanto, aleatórios, e a conversão para bigint (máx. 19 dígitos) ou decimal não ajuda em nada.
fonte
Isso pode ajudar sem arredondar
fonte
Converta em um
integer
primeiro e depois em umstring
:fonte
Tente este, deve funcionar:
fonte
Se você usar uma função CLR, poderá converter o float em uma sequência que se pareça com o float, sem todos os 0 extra no final.
Função CLR
.
Exemplo
.
Resultado
.
Embargo
Todas as cadeias convertidas são truncadas com 18 casas decimais e não há zeros à direita. 18 dígitos de precisão não são um problema para nós. E 100% de nossos números de FP (perto de 100.000 valores) parecem idênticos como valores de sequência de caracteres, como no banco de dados, como números de FP.
fonte
A resposta do Axel modificada um pouco, como em certos casos, produzirá resultados indesejáveis.
fonte
da documentação REPLACE () :
testes:
nulo ==> [NULL]
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
fonte
Selecione
conversão (substituir (converter (decimal (15,2), acs_daily_debit), '.', ',') Como varchar (20))
de acs_balance_details
fonte
Com base na resposta da molecular:
fonte
Acabei de me deparar com uma situação semelhante e fiquei surpreso com os problemas de arredondamento de 'números muito grandes' apresentados no SSMS v17.9.1 / SQL 2017.
Não estou sugerindo uma solução, mas observei que o FORMAT apresenta um número que parece correto. Não posso sugerir que isso reduza outros problemas de arredondamento ou seja útil em uma função matemática complicada.
T Código SQL fornecido, que deve demonstrar claramente minhas observações, permitindo que outras pessoas testem seu código e idéias, se necessário.
fonte
é a melhor maneira para você não adicionar
.0000
nenhum dígito no final do valor.fonte