SQLServer中的Float上的Len函数给出了错误的长度

时间:2016-09-28 06:52:47

标签: sql sql-server tsql

我在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

我的问题是:

  1. '缬氨酸'列显示正确的值。
  2. ' NVAL'栏目显示奇怪的价值请解释我们为什么会这样显示?
  3. '莱恩'显示长度,其实际长度为10,但它显示了12。请解释为什么它显示12而不是10。

4 个答案:

答案 0 :(得分:7)

sql server中的float可以是4或8个字节。 Find details

LEN()是一个测量字符串长度的函数。所以你想测量值的字符串表示的长度,而不是值本身。

显示的显示值1.07994e+006是科学记数法,有12个字符。这里没有错。

您的来电Convert(nvarchar(20),@dt)调用CONVERT() - 函数,默认为FLOAT and REALDetails and other formats here),科学的数字大于6位数。当你打电话给#len; len(@dt)'时,同样会发生这种情况。由于LEN()的输入必须是字符串,因此转换该值,然后将其传递给函数。

你能做什么:

无论如何,您必须考虑,您看到的文字不是真正的价值

答案 1 :(得分:2)

  

LEN()适用于[N] VARCHAR(),因此您正在进行从FLOAT到VARCHAR的隐式转换

请参阅:https://social.msdn.microsoft.com/Forums/sqlserver/en-US/a4ea2bc1-6f2f-4992-8132-f824fe4ffce0/length-of-float-values-in-ms-sql-server-gives-wrong-result?forum=transactsql

这意味着LEN在实际计算其长度之前将值转换为VARCHAR。这是因为您获得的长度与NVarChar1.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