Подтвердить что ты не робот

Лить или преобразовать поплавок в nvarchar?

Мне нужно выбрать один столбец типа float и вставить его в другой столбец как nvarchar.

Я попытался использовать его: cast([Column_Name] as nvarchar(50))

Результат был 9.07235e+009 вместо десятизначного числа (номер телефона).

Кто-нибудь знает, как правильно или правильно преобразовать эти данные?

4b9b3361

Ответ 1

Отметьте STR. Вам нужно что-то вроде SELECT STR([Column_Name],10,0) ** Это решение SQL Server, для других серверов проверяйте свои документы.

Ответ 2

Если вы храните номера телефонов в столбце с поплавком (это плохая идея), то они предположительно являются целыми числами и могут быть отброшены до int перед кастом в nvarchar.

Итак, вместо:

select cast(cast(1234567890 as float) as nvarchar(50))
1.23457e+009

Вы бы использовали:

select cast(cast(cast(1234567890 as float) as int) as nvarchar(50))
1234567890

В этих примерах используется более внутренняя cast(1234567890 as float) вместо выбора значения из соответствующего столбца.

Я действительно рекомендую, что вы не храните телефонные номера в поплавках! Что делать, если номер телефона начинается с нуля?

select cast(0100884555 as float)
100884555

Упс! Мы просто сохранили неправильный номер телефона...

Ответ 3

Не использовать поплавки для хранения данных с фиксированной точкой, требующих точности. В этом примере показано, как правильно преобразовать float в NVARCHAR (50), а также показывая, почему это плохая идея использовать float для точных данных.

create table #f ([Column_Name] float)
insert #f select 9072351234
insert #f select 907235123400000000000

select
    cast([Column_Name] as nvarchar(50)),
    --cast([Column_Name] as int), Arithmetic overflow
    --cast([Column_Name] as bigint), Arithmetic overflow
    CAST(LTRIM(STR([Column_Name],50)) AS NVARCHAR(50))
from #f

Выход

9.07235e+009    9072351234
9.07235e+020    907235123400000010000

Вы можете заметить, что второй выход заканчивается на "10000", хотя данные, которые мы пытались сохранить в таблице, заканчиваются на "00000". Это связано с тем, что тип данных float имеет фиксированное число значимых цифр, которые не распространяются так далеко.

Ответ 4

DECLARE @MyFloat [float]

SET @MyFloat = 1000109360.050

ВЫБЕРИТЕ ЗАМЕНИТЬ (RTRIM (ЗАМЕНИТЬ (ЗАМЕНИТЬ (RTRIM ((ЗАМЕНИТЬ (CAST (CAST (@MyFloat AS DECIMAL (38, 18)) AS VARCHAR (max)), '0', ''))), ', '0'), '.', '')), '', '.')