【发布时间】:2020-09-03 21:12:03
【问题描述】:
谁能解释以下查询的结果?我认为这是 SQL Server 2014 中的一个错误。
DECLARE @x float
SET @x=58.415
SELECT ROUND(58.415,2), ROUND(@x,2)
【问题讨论】:
标签: sql sql-server tsql sql-server-2014 reporting
谁能解释以下查询的结果?我认为这是 SQL Server 2014 中的一个错误。
DECLARE @x float
SET @x=58.415
SELECT ROUND(58.415,2), ROUND(@x,2)
【问题讨论】:
标签: sql sql-server tsql sql-server-2014 reporting
因为第一个参数存储为十进制(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
基本上,浮动是
用于浮点数值的近似数数据类型 数据。浮点数据是近似的;因此,并非所有值 数据类型范围可以精确表示。
@Zohar 所做的改进解释了为什么值为converted to decimal:
在 Transact-SQL 语句中,带小数点的常量是 使用最小值自动转换为数值数据值 精度和规模是必要的。例如,常数 12.345 是 转换为精度为 5、小数位数为 3 的数值
【讨论】:
您所看到的解释是浮点运算在 SQL Server(或任何其他数据库或编程语言)中并不精确。以下是实际发生的情况,显示“真实”值以供解释:
SELECT
ROUND(58.415, 2), -- rounds UP to 58.420, this is DECIMAL(10,3), EXACT
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) 可以工作。
【讨论】:
DECIMAL 类型,但我想这也是正确解释的一部分。