有人可以解释以下代码的结果吗?我认为这是SQL SERVER 2014中的错误
DECLARE @x float
SET @x=58.415
SELECT ROUND(58.415,2), ROUND(@x,2)
因为第一个参数存储为十进制(5,3):
EXEC sp_describe_first_result_set N'SELECT 58.415 x', null, 0;
您有两个不同的代码:
DECLARE @x float
SET @x=58.415
SELECT ROUND(58.415,2), ROUND(@x,2)
GO
DECLARE @x decimal(19,3)
SET @x=58.415
SELECT ROUND(58.415,2), ROUND(@x,2)
GO
基本上是浮点数
与浮点数字一起使用的近似数字数据类型数据。浮点数据是近似值;因此,并非所有的值数据类型范围可以准确表示。
您所看到的解释是,浮点算术在SQL Server(或任何其他数据库或编程语言)中不正确。这是实际发生的情况,其中显示了“真实”值以供说明:
SELECT
ROUND(58.415, 2), -- rounds UP to 58.420
ROUND(58.4149999999999, 2) -- rounds DOWN to 58.41
这里的问题是,当您进行以下变量分配时:
DECLARE @x float
SET @x = 58.415
内部,SQL Server实际上将值存储为近似值,类似于58.41499999999
。然后,四舍五入到小数点后两位时,您剩下58.41
。
通常,如果需要精确的精度,则应使用精确的类型。在这种情况下,DECIMAL(10,3)
将起作用。