SQL SERVER 2014错误报告

问题描述 投票:0回答:2

有人可以解释以下代码的结果吗?我认为这是SQL SERVER 2014中的错误

DECLARE @x float
SET @x=58.415
SELECT ROUND(58.415,2), ROUND(@x,2)

enter image description here

sql sql-server tsql sql-server-2014 reporting
2个回答
1
投票

因为第一个参数存储为十进制(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

基本上是浮点数

与浮点数字一起使用的近似数字数据类型数据。浮点数据是近似值;因此,并非所有的值数据类型范围可以准确表示。


0
投票

您所看到的解释是,浮点算术在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)将起作用。

© www.soinside.com 2019 - 2024. All rights reserved.