与先前的SQL Server版本相比,ROUND函数返回SQL Server 2016的不同结果

时间:2018-04-10 05:21:21

标签: sql-server

对具有SQL Server 2008,SQL 2012,SQL 2014和SQL Server 2016兼容模式的数据库执行以下语句。

SQL Server 2008,SQL Server 2012和SQL Server 2014返回的结果与SQL Server 2016相同。

SQL语句:

DECLARE @VarFloat FLOAT    
SET @VarFloat = 1.90255    

SELECT ROUND(@VarFloat, 4) Variable_Float, ROUND(1.90255, 4) Input_Float

在SQL Server 2008/2012 / 2014上执行时的结果:

Variable_Float         Input_Float
---------------------- -----------
1.9026                 1.90260

在SQL Server 2016上执行时的结果:

Variable_Float         Input_Float
---------------------- ------------
1.9025                 1.90260

SQL Server 2016的轮次与以前的版本不同,似乎已将该值向下舍入。有没有人遇到类似的问题?

谢谢!

2 个答案:

答案 0 :(得分:0)

浮点运算在SQL Server以及大多数其他语言中并不精确,因此就标准而言,您所看到的轻微变化是合法的。如果您需要精确存储空间,请使用NUMERICDECIMAL。来自documentation

  

请注意,小数和数字数据类型彼此完全相同。这两种数据类型都保留在产品中以实现向后兼容。当您需要存储带小数位的精确数字数据时,可以使用任何数据类型

答案 1 :(得分:0)

实际上,SQL Server 2016的轮换方式与其他所有方法不同,这可能只与这一个数字巧合。如果您要选择另一个版本,则版本可能根本不对齐。

这里发生的是为什么float是一种在SQL Server中使用的“危险”格式的经典示例。根据官方documentation

  

用于浮点数字的近似数字数据类型   数据。浮点数据是近似值;因此,并非所有的价值观   数据类型范围可以准确表示。 ISO的同义词   真实是浮动(24)。

如果您想拥有带小数位的确切数据,您应该使用SQL Server decimal data type