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



我很难理解为什么将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

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

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

所以你有两个不同的东西在运行转换。SQL Server Management Studio1通常会选择与SQL Server本身选择的转换类似的转换,但正如您在这里的测试用例中观察到的那样,这绝不能保证


1假设为人们提出此类问题的通常起点。但同样适用于SQL Fiddle。@b到字符串的转换由SQL Server控制。@a转换是由SQL Fiddle应用程序中的一些代码执行的。这可能是SQL Fiddle内置的语言/框架,也可能是一些自定义代码。没关系。关键的区别在于,它是由(可能(不同的作者编写的不同的代码,他们对特定的转换是什么有不同的看法,使成为明智的

最新更新