0 *-1 = -0将float转换为varchar时出现怪异结果

时间:2018-07-30 13:52:28

标签: sql sql-server sql-server-2012

我很难理解为什么将float转换为varchar会返回-0而不是0

DECLARE @a FLOAT

SET @a = 0
SET @a= @a * -1

SELECT @a --return 0

DECLARE @b as VARCHAR(10)
SET @b=@a

SELECT @b -- this return -0

如您所见,以上代码将返回-0。我当前的解决方法是将另一个强制转换添加为十进制,如下所示:

SET @a= cast(@a AS decimal(10,2)) *-1

我的问题是:为什么该代码返回-0而不是0

SQL Fiddle

1 个答案:

答案 0 :(得分:2)

当您执行SELECT @a时,您将返回一个结果集,该结果集由某些类型为float的单列组成的客户端(例如SQL Server Management Studio)。然后,由该工具使用其在编程环境中认为合适的任何选项,将float转换为string

@a分配给@b时,将强制进行从floatvarchar(10)的隐式转换。 SQL Server 决定如何执行此转换,然后将数据发送到第二个结果集中的客户端工具。客户端工具可能几乎不执行任何操作或完全不执行任何操作,因为在某种程度上它已经是字符串。

因此,您有两种不同的方式来进行转化。 SQL Server Management Studio 1 通常会 选择与SQL Server本身选择的转换类似的转换,但是它绝对不能保证 ,因为您在这里观察您的测试用例。


1 被认为是人们提出此类问题的通常起点。但是对于SQL Fiddle同样有效。 @b到字符串的转换由SQL Server控制。 @a转换是通过SQL Fiddle应用程序中的某些代码 执行的。这可能是内置于SQL Fiddle的语言/框架中的内容或某些自定义代码。没关系关键区别在于,这是由(可能)不同的作者(可能(可能))对明智的默认选择是什么构成的(可能)不同观点编写的不同代码。