代码之家  ›  专栏  ›  技术社区  ›  Misiu

0*-1=-0将float强制转换为varchar时的奇怪结果

  •  2
  • Misiu  · 技术社区  · 6 年前

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

    SQL Fiddle

    1 回复  |  直到 6 年前
        1
  •  2
  •   Damien_The_Unbeliever    6 年前

    当你这样做的时候 SELECT @a ,您将向某个客户端(如SQL Server Management Studio)返回一个结果集,该客户端由一个类型的单列组成。 float . 到那时为止 那个工具 把它转换成 浮动 变成一个 string 使用它认为在编程环境中合适的任何选项。

    当你分配 @a @b ,强制从 浮动 varchar(10) . SQL服务器 决定如何执行此转换,然后在第二个结果集中将该数据发送到客户机工具。客户机工具可能很少或根本不进行操作,因为在某种程度上,它已经是一个字符串。

    所以你有两个不同的东西在运行转换。SQL Server管理工作室 通常 选择类似于SQL Server本身选择的转换,但它 决不保证 ,正如您在这里用您的测试用例观察的那样。


    被假定为提出此类问题的人通常的出发点。但对SQL小提琴同样有效。这个 @乙 转换为字符串由SQL Server控制。这个 @ 转换是由某些代码执行的 在内部 SQL fiddle应用程序。这可能是语言/框架中内置的东西,也可能是一些自定义代码。没关系。关键区别在于 不同的 由不同的作者(可能)编写的代码,对特定转换的原因有不同的看法。 明智的 默认选项。