преобразование большого числа с плавающей точкой в ​​varchar SQL Server - PullRequest
0 голосов
/ 01 марта 2011

Когда я конвертирую несколько больших чисел типа:

61326085092
161569087548
169193968080
208082024640
230160816344

после использования

Cast(@FloatValue as nvarchar)

Я получаю:

61326100000
161569000000
169194000000
208082000000
230161000000

Это действительно плохо ... так как я могу получить точные значения ??

Я делаю запрос:

INSERT INTO #someT (id,Value) values('''+Cast(@counterI+1 as nvarchar)+''','''+Cast(@Val as nvarchar)+''')';

Ответы [ 4 ]

3 голосов
/ 01 марта 2011

Для чисел, которые вы разместили LTRIM(STR(f,32)) отлично работает.

with floats(f) as
(
SELECT cast(61326085092 as float) union all
SELECT 161569087548 union all
SELECT 169193968080 union all
SELECT 208082024640 union all
SELECT 230160816344  union all
SELECT 230160816344.12
)
select f, CAST(f as nvarchar) as v, LTRIM(STR(f,32)) as s1, LTRIM(STR(f,32,10)) as s2
FROM floats

Возвращает

f                      v                  s1             s2
---------------------- ----------------- -------------- --------------------------------
61326085092            6.13261e+010        61326085092           61326085092.0000000000
161569087548           1.61569e+011       161569087548          161569087548.0000000000
169193968080           1.69194e+011       169193968080          169193968080.0000000000
208082024640           2.08082e+011       208082024640          208082024640.0000000000
230160816344           2.30161e+011       230160816344          230160816344.0000000000
230160816344.12        2.30161e+011       230160816344          230160816344.1200000000
1 голос
/ 01 марта 2011
Cast(cast(@FloatValue as numeric) as nvarchar)

Выберите подходящий numeric масштаб и точность для вашего случая. Вы всегда будете иметь эту проблему с плавающими и реальными, они изначально неточны.

1 голос
/ 01 марта 2011

Это из-за точности.

Попробуйте использовать Float(53) или Decimal(38,18)

Вы действительно используете поплавки? Числа, которые вы отправили, выглядят как целые числа ...

0 голосов
/ 01 марта 2011

Являются ли они всегда целыми значениями (то есть без десятичных знаков), если это так, вместо этого преобразуйте в bigint

declare @f float =230160816344

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