Ответ 1
Попробуйте использовать функцию STR()
.
SELECT STR(float_field, 25, 5)
Другое примечание: эти прокладки слева с пробелами. Если проблема связана с LTRIM
:
SELECT LTRIM(STR(float_field, 25, 5))
У меня есть float-столбец с номерами различной длины, и я пытаюсь преобразовать их в varchar.
Некоторые значения превышают максимальный размер maxint, поэтому я не могу сделать что-то вроде этого
cast(cast(float_field as bigint) as varchar(100))
Я пробовал использовать десятичное число, но числа не имеют одинакового размера, поэтому это тоже не помогает
CONVERT(varchar(100), Cast(float_field as decimal(38, 0)))
Любая помощь приветствуется.
UPDATE:
Значение выборки 2.2000012095022E + 26.
Попробуйте использовать функцию STR()
.
SELECT STR(float_field, 25, 5)
Другое примечание: эти прокладки слева с пробелами. Если проблема связана с LTRIM
:
SELECT LTRIM(STR(float_field, 25, 5))
Единственный бит запроса, который я нашел, который возвращает ТОЧНО, тот же оригинальный номер
CONVERT (VARCHAR(50), float_field,128)
См. http://www.connectsql.com/2011/04/normal-0-microsoftinternetexplorer4.html
Другие вышеприведенные решения иногда будут округлять или добавлять цифры в конце
ОБНОВЛЕНИЕ. В соответствии с приведенными ниже комментариями и тем, что я вижу в https://msdn.microsoft.com/en-us/library/ms187928.aspx:
CONVERT (VARCHAR(50), float_field,3)
Должны использоваться в новых версиях SQL Server (база данных Azure SQL и запуск в SQL Server 2016 RC3)
это решение, которое я использовал в sqlserver 2012 (так как у всех других предложений был недостаток усечения дробной части или какой-то другой недостаток).
declare @float float = 1000000000.1234;
select format(@float, N'#.##############################');
выход:
1000000000.1234
у этого есть еще одно преимущество (в моем случае), чтобы облегчить сепаратор тысяч и локализацию:
select format(@float, N'#,##0.##########', 'de-DE');
выход:
1.000.000.000,1234
Сначала конвертируйте в integer
, а затем в string
:
cast((convert(int,b.tax_id)) as varchar(20))
float имеет только макс. точность 15 цифр. Поэтому цифры после 15-й позиции являются случайными, и преобразование в bigint (максимум 19 цифр) или десятичное значение не помогает вам.
Полезная тема.
Если вы хотите, чтобы я удалял ноты нуля, вы можете использовать это:
DECLARE @MyFloat [float];
SET @MyFloat = 1000109360.050;
SELECT REPLACE(RTRIM(REPLACE(REPLACE(RTRIM(LTRIM(REPLACE(STR(@MyFloat, 38, 16), '0', ' '))), ' ', '0'),'.',' ')),' ',',')
Это может помочь без округления
declare @test float(25)
declare @test1 decimal(10,5)
select @test = 34.0387597207
select @test
set @test1 = convert (decimal(10,5), @test)
select cast((@test1) as varchar(12))
Select LEFT(cast((@test1) as varchar(12)),LEN(cast((@test1) as varchar(12)))-1)
Если вы используете функцию CLR, вы можете преобразовать float в строку, которая выглядит так же, как float, без лишних 0 в конце.
[Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)]
[return: SqlFacet(MaxSize = 50)]
public static SqlString float_to_str(double Value, int TruncAfter)
{
string rtn1 = Value.ToString("R");
string rtn2 = Value.ToString("0." + new string('0', TruncAfter));
if (rtn1.Length < rtn2.Length) { return rtn1; } else { return rtn2; }
}
.
create table #temp (value float)
insert into #temp values (0.73), (0), (0.63921), (-0.70945), (0.28), (0.72000002861023), (3.7), (-0.01), (0.86), (0.55489), (0.439999997615814)
select value,
dbo.float_to_str(value, 18) as converted,
case when value = cast(dbo.float_to_str(value, 18) as float) then 1 else 0 end as same
from #temp
drop table #temp
.
value converted same
---------------------- -------------------------- -----------
0.73 0.73 1
0 0 1
0.63921 0.63921 1
-0.70945 -0.70945 1
0.28 0.28 1
0.72000002861023 0.72000002861023 1
3.7 3.7 1
-0.01 -0.01 1
0.86 0.86 1
0.55489 0.55489 1
0.439999997615814 0.439999997615814 1
.
Все преобразованные строки усекаются в 18 десятичных разрядов, и нет нулевых нулей. 18 цифр точности не проблема для нас. И 100% наших номеров FP (около 100 000 значений) выглядят идентичными строковым значениям, как в базе данных, как номера FP.
Модифицированный ответ Axel бит, так как в некоторых случаях это приведет к нежелательным результатам.
DECLARE @MyFloat [float];
SET @MyFloat = 1000109360.050;
SELECT REPLACE(RTRIM(REPLACE(REPLACE(RTRIM((REPLACE(CAST(CAST(@MyFloat AS DECIMAL(38,18)) AS VARCHAR(max)), '0', ' '))), ' ', '0'),'.',' ')),' ','.')
select replace(myFloat, '', '')
Возвращает nvarchar, если один из входных аргументов имеет тип данных nvarchar; в противном случае REPLACE возвращает varchar.
Возвращает NULL, если любой из аргументов равен NULL.
тесты:
null == > [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
Выбрать
cast (replace (convert (decimal (15,2), acs_daily_debit), '.', ',') как varchar (20))
из acs_balance_details
Попробуйте это, нужно работать:
cast((convert(bigint,b.tax_id)) as varchar(20))
Основываясь на молекулярном ответе:
DECLARE @F FLOAT = 1000000000.1234;
SELECT @F AS Original, CAST(FORMAT(@F, N'#.##############################') AS VARCHAR) AS Formatted;
SET @F = 823399066925.049
SELECT @F AS Original, CAST(@F AS VARCHAR) AS Formatted
UNION ALL SELECT @F AS Original, CONVERT(VARCHAR(128), @F, 128) AS Formatted
UNION ALL SELECT @F AS Original, CAST(FORMAT(@F, N'G') AS VARCHAR) AS Formatted;
SET @F = 0.502184537571209
SELECT @F AS Original, CAST(@F AS VARCHAR) AS Formatted
UNION ALL SELECT @F AS Original, CONVERT(VARCHAR(128), @F, 128) AS Formatted
UNION ALL SELECT @F AS Original, CAST(FORMAT(@F, N'G') AS VARCHAR) AS Formatted;