对具有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的轮次与以前的版本不同,似乎已将该值向下舍入。有没有人遇到类似的问题?
谢谢!
答案 0 :(得分:0)
浮点运算在SQL Server以及大多数其他语言中并不精确,因此就标准而言,您所看到的轻微变化是合法的。如果您需要精确存储空间,请使用NUMERIC
或DECIMAL
。来自documentation:
请注意,小数和数字数据类型彼此完全相同。这两种数据类型都保留在产品中以实现向后兼容。当您需要存储带小数位的精确数字数据时,可以使用任何数据类型
答案 1 :(得分:0)
实际上,SQL Server 2016的轮换方式与其他所有方法不同,这可能只与这一个数字巧合。如果您要选择另一个版本,则版本可能根本不对齐。
这里发生的是为什么float
是一种在SQL Server中使用的“危险”格式的经典示例。根据官方documentation:
用于浮点数字的近似数字数据类型 数据。浮点数据是近似值;因此,并非所有的价值观 数据类型范围可以准确表示。 ISO的同义词 真实是浮动(24)。
如果您想拥有带小数位的确切数据,您应该使用SQL Server decimal
data type。