Почему приведение типов с плавающего к varchar округляется в SQL Server - PullRequest
7 голосов
/ 28 июня 2011

После sql

declare @a as float, @b as float

select @a=1.353954 , @b=1.353956
select 
CAST(@a as VARCHAR(40)) AS a_float_to_varchar ,
CAST(@b as VARCHAR(40)) AS b_float_to_varchar

результаты в

a_float_to_varchar                       b_float_to_varchar
---------------------------------------- ----------------------------------------
1.35395                                  1.35396

на основе

http://msdn.microsoft.com/en-us/library/ms173773.aspx

float имеет точность 15 цифр, поэтому я не уверен, почему число округляется при преобразовании в varchar

Ответы [ 3 ]

14 голосов
/ 28 июня 2011

Также по вашей ссылке (на самом деле это первая строка):

Типы данных с приблизительными числами ...

Если вам нужна точная точность, неиспользуйте float.

При этом существует функция STR () специально для преобразования float в символьный тип данных.

4 голосов
/ 29 июня 2011

приведение к десятичной дроби перед приведением к varchar:

declare @a as float, @b as float

select @a=1.353954 , @b=1.353956
select 
CAST(CAST(@a AS DECIMAL(38,18)) as VARCHAR(40)) AS a_float_to_varchar ,
CAST(CAST(@b AS DECIMAL(38,18)) as VARCHAR(40)) AS b_float_to_varchar
3 голосов
/ 07 июля 2016

Вы можете указать стиль, чтобы включить больше цифр.

declare @gg float
set @gg = 124.323125453
SELECT @gg,Convert(varchar, @gg,128)

для более новых версий сервера sql используйте SELECT @gg,Convert(varchar, @gg,3)

возвращает

124.323125453   124.323125453

https://msdn.microsoft.com/en-us/library/ms187928.aspx

или с STR ()

declare @gg float
set @gg = 124.323124354234524
SELECT @gg,str(@gg,16,15)

должен дать вам все возможные цифры. 16 - это общая возможная длина (включает точку), в то время как 15 знаков после десятичной дроби возможны (фактически 0,2323 ... отсчет 0 к длине, поэтому длина должна быть 17, если все числа меньше 1), однако STR () результаты с ведущими пробелами и трейлингом 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...