Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 隐式转换和舍入_Sql Server_Sql Server 2005_Tsql - Fatal编程技术网

Sql server 隐式转换和舍入

Sql server 隐式转换和舍入,sql-server,sql-server-2005,tsql,Sql Server,Sql Server 2005,Tsql,遇到一个有趣的问题: declare @test as int set @test = 47 select @test * 4.333 返回203.651 declare @test as int set @test = 47 declare @out as int set @out = (select @test * 4.333) select @out 返回203 declare @test as int set @test = 47 declare @out as int se

遇到一个有趣的问题:

declare @test as int
set @test = 47

select @test * 4.333
返回203.651

declare @test as int
set @test = 47

declare @out as int
set @out = (select @test * 4.333)

select @out
返回203

declare @test as int
set @test = 47

declare @out as int
set @out = round((select @test * 4.333),0)

select @out
返回204

现在我知道它为什么会这样。这是因为存在从decimal到int的隐式转换,因此小数位数需要截断(因此为203),而如果在隐式转换之前进行四舍五入,则得到204

我的问题是为什么SQL Server进行隐式转换时,它不也是舍入吗?我知道如果我有一个大的数字,并且它需要存储在一个小的地方,我要做的第一件事就是舍入它,以便尽可能接近原始数字


这对我来说似乎并不直观。

这让我读了起来,答案显然不令人满意,我在第4.4.1节“数字的特征”中找到的最早的SQL参考(ANSI 92可用)指出

无论何时将精确或近似的数值指定给 表示精确数值的数据项或参数, 其值的近似值,可保持领先的显著性 数据中表示舍入或截断后的数字 目标的类型。将该值转换为具有精度和 目标的规模。选择是截断还是舍入 是否定义了实现

这就让微软来决定他们选择为T-SQL实现哪一个,我认为为了简单起见,他们选择了截断。从表面上看,这在当时似乎不是一个罕见的决定

有趣的是,根据我找到的文档,只有转换为整数才会导致截断,其他的会导致舍入。尽管由于某种奇怪的原因,从
货币
整数
的转换似乎与趋势相反,因为它被允许四舍五入

From To behavior
数字轮
数值整数截断
数字货币轮
货币整数
货币数字轮
浮点整数截断
浮点数字轮
时轮浮动
日期时间整轮
来自的表格