我在SQL Server中使用以下查询。
declare @dt float
set @dt = 1079938.05
select @dt AS Val,Convert(nvarchar(20),@dt) AS NVal, len(@dt) AS Len
它的输出是
Val NVal Len
1079938.05 1.07994e+006 12
我的问题是:
答案 0 :(得分:7)
sql server中的float
可以是4或8个字节。 Find details
LEN()
是一个测量字符串长度的函数。所以你想测量值的字符串表示的长度,而不是值本身。
显示的显示值1.07994e+006
是科学记数法,有12个字符。这里没有错。
您的来电Convert(nvarchar(20),@dt)
调用CONVERT()
- 函数,默认为FLOAT and REAL
(Details and other formats here),科学的数字大于6位数。当你打电话给#len; len(@dt)'时,同样会发生这种情况。由于LEN()
的输入必须是字符串,因此转换该值,然后将其传递给函数。
你能做什么:
您可能会考虑转换为DECIMAL
...
另一个选择首先是use STR()
-function和RTRIM()
。
无论如何,您必须考虑,您看到的文字不是真正的价值。
答案 1 :(得分:2)
LEN()适用于[N] VARCHAR(),因此您正在进行从FLOAT到VARCHAR的隐式转换
这意味着LEN
在实际计算其长度之前将值转换为VARCHAR
。这是因为您获得的长度与NVarChar
值1.07994e+006
的长度一致。
答案 2 :(得分:2)
首先:不要强迫使用近似数据类型。 FLOAT
只是一个近似值,例如例如,可以将诸如0.123的简单值存储为0.1230000000001。请使用精确类型,例如DECIMAL
。
将数字转换为字符串时,通常应指定format(@dt, '#,###,##0.00')
中的格式。你没有这样做,所以它取决于系统使用什么格式。它使用科学记数法1.07994e + 006转换为1.079940 x 10 ^ 6,这大约是你的数字。
答案 3 :(得分:0)
检查:-
select @dt AS Val,Convert(nvarchar(20),@dt) AS NVal, len(CAST(CAST(@dt AS DECIMAL(20)) AS VARCHAR(20))) AS Len